Использование сообщения об ошибке 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 и работает нормально.

2

Решение

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

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

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

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]