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 и отлично работает.


person bey23    schedule 26.05.2017    source источник
comment
Можете ли вы попробовать заключить в кавычки все эти строковые параметры (например, '$bd')?   -  person Flakes    schedule 26.05.2017
comment
Если я это сделаю, то вернет ошибку: PHP Fatal error: Cannot pass parameter 2 by reference in... (я удалил необязательные значения).   -  person bey23    schedule 26.05.2017


Ответы (1)


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

outs в данном IDL поясняют, что все параметры должны передаваться по ссылке с определенным типом, а не вариантом.

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

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

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

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

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

person Kul-Tigin    schedule 30.05.2017