Я использую 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 и отлично работал.
Это очень строгая подпись для 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
не являются надежными, чтобы указывать правильную позицию параметра большую часть времени.