Передать ссылку на 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 />";