Передать ссылку на COM-объект в PHP
Поэтому я надеюсь, что кто-то может помочь, и я уверен, что это, наверное, что-то простое, что мне не хватает. Я использую PHP для доступа к API.net для стороннего программного обеспечения.
Основываясь на самой минималистской документации по API, у меня есть рабочий vbsript, который соединяется с объектом, выполняет вход в систему и затем выполняет запрос, результатом которого является вывод сбрасываемого запроса в поле сообщения.
Здесь пример vbscript:
'Test device status
Set xxx = CreateObject("The.API.Object.Goes.Here")
'Login
Result = Xxx.LoginToHost("xxx.xxx.xxx.xxx","8989","Administrator","")
if (Result = true) then
MsgBox("OK")
else
MsgBox("Error - " & Xxx.LastError)
WScript.Quit
end if
'Get Status
Result = Xxx.GetDeviceStatus("", out)
if (Result = true) then
MsgBox(out)
else
MsgBox("Error - " & Xxx.LastError)
end if
'Logout
Result = Xxx.Logout()
if (Result = true) then
MsgBox("Logout OK")
else
MsgBox("Error - " & Xxx.LastError)
end if
Xxx.GetDeviceStatus имеет два периметра, первый из которых является целевым устройством, или если пустой пустым возвращает все устройства, второй - это строковая переменная, чтобы сбрасывать результат.
Когда выполняется script, второе поле сообщения содержит список всех устройств, как я ожидал.
В PHP у меня есть:
$obj = new DOTNET("XxxScripting, Version=1.0.XXXX.XXXXXX, Culture=neutral, PublicKeyToken=XXXXXXXXXXXXXXXX","Here.Goes.The.Api");
$obj->LoginToHost('xxx.xxx.xxx.xxx','8989','Administrator','');
$result = $obj->GetDeviceStatus('','out');
echo $result."<br />";
Результат эхо-ответа дает 1, потому что значение результата является логическим значением, а GetDeviceStatus успешным. Я не могу понять, как получить значение "out", которое является фактическим результатом запроса.
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Второй параметр вызова метода GetDeviceStatus()
в соответствии с VBScript должен передать переменную, которая будет заполнена выходом.
Однако в примере PHP вы просто передаете строку 'out'
, которая не эквивалентна тому, что делается в VBScript.
Вместо этого попробуйте передать переменную PHP в этот метод и затем повторить эту переменную для экрана, например:
$result = $obj->GetDeviceStatus('', $out);
if ($result)
echo $out."<br />";
После небольшого копания он появляется в соответствии с Справочник PHP, который вам необходимо передать переменными By Reference в COM с помощью данных VARIANT
тип.
Цитата из ferozzahid [at] usa [dot] com на PHP - функции COM
"Чтобы передать параметр по ссылке на COM-функцию, вам необходимо передать VARIANT. Общие типы данных, такие как целые числа и строки, не будут работать для него."
Учитывая это, возможно, это сработает;
$out = new VARIANT;
$result = $obj->GetDeviceStatus('', $out);
if ($result)
echo $out."<br />";