Intereting Posts
Создание цветов после нанесения непрозрачности черно-белого Выпадающее меню подтверждения CodeIgniter Не удается отправить письма только в Hotmail. (gmail и т. д. отлично работает) загрузка файла с одинарными кавычками в filename с помощью move_uploaded_file не работает Ошибка при выполнении ассемблерного дампа (ошибка синтаксического анализа: сбой в `&: extend (.clearfix all);`) проверка, если логин и корзина пуста как изменить структуру URL с кодом 301 q2a упорядочение списка файлов в папке с использованием php PHP: эхо-массив возвращает массив слов вместо его содержимого Почему мой оригинальный IP-адрес все еще отображается, даже когда я использую CURLOPT_PROXY с Curl? Как использовать тернарный оператор вместо if-else в PHP Что происходит быстрее, большой объединенный запрос с большим количеством PHP или несколькими небольшими выборками с меньшим количеством PHP? htaccess переписать URL php параметры Как я могу остановить PHP sleep (), влияющий на весь мой PHP-код? Google App Engine (php): функция glob ()

PHP – использование сообщения об ошибке COM: параметр 5: несоответствие типов

Я использую PHP для вызова объекта на сервере с классом COM в IIS 7.

Объект хорошо создан, но когда я использую его метод, PHP возвращает эту ошибку:

PHP Fatal error: Uncaught exception 'com_exception' with message 'Parameter 5: Type mismatch. 

Ошибка возникает в параметре $ bd.

Мой PHP-код:

 $oem = new COM("LogicControlOEM.OEM_EjecutaOEM") or die("ERROR"); var_dump($oem); $empresa = 1; $usuario = 'XXX'; $pass = 'XXX'; $proveedor = ''; $servidor = 'XXXX'; $bd = 'example'; // I tried to putting a (string) and (String) before $oem->InicializaOEM($empresa, $usuario, $pass, $proveedor, $servidor, $bd); var_dump($oem); $oem = null; 

Я получил функцию, которую хочу использовать внутри компонента:

 HRESULT InicializaOEM( [in, out] short* intEmpresa, [in, out] BSTR* sUserName, [in, out] BSTR* sPassword, [in, out, optional] BSTR* sProvider, [in, out, optional] BSTR* sDataSource, [in, out, optional] BSTR* sCatalog); 

Какой тип BSTR и почему возникают только проблемы с последним параметром? Я думаю, это тип визуальной базовой переменной строки …

Я пробовал те же параметры в файле .vbs и отлично работал.

Solutions Collecting From Web of "PHP – использование сообщения об ошибке COM: параметр 5: несоответствие типов"

Это очень строгая подпись для COM-метода, не знаю, из-за строгих требований или плохого дизайна, вы это решите.

out s в данном IDL уточняют, что все параметры, необходимые для передачи по ссылке определенного типа , а не варианта.

Даже в среде, такой как VBScript, где почти все есть вариант COM, невозможно передать параметры по ссылке на такой метод, если в библиотеке COM нет специальной обработки , поскольку вы не можете объявлять строго типизированные переменные в VBScript.

Опять же в VBScript есть взломанный ByVal, поэтому можно было бы добавить дополнительные скобки вокруг параметров, зная, что вы не сможете получить доступ к параметрам, если они модифицированы в методе COM. Но, к сожалению, этот хак неприменим в библиотеке COM PHP.

Лучшее, что вы можете сделать, это написать COM-библиотеку, которая обертывает пространство имен LogicControlOEM но везде принимает параметры.

Простейшей средой для создания такой библиотеки является, конечно, Visual Basic 6.0. Обратите внимание, что это только 32-бит.

BTW Никакое значительное обслуживание не было сделано для PHP COM с конца 2005 года. И на основе опыта я могу сказать, что сообщения об ошибках com_exception не являются надежными, чтобы указывать правильную позицию параметра большую часть времени.