Поэтому я надеюсь, что кто-то может помочь, и я уверен, что это, вероятно, что-то простое, что я скучаю. Я использую PHP для доступа к .net API для стороннего программного обеспечения.
Основываясь на очень минималистической документации по API, у меня есть работающий vbscript, который подключается к объекту, выполняет вход в систему и затем выполняет запрос, который приводит к выводу запроса в окно сообщения.
Вот пример 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 имеет два периметра, первый из которых является целью устройства или, если оставить пустым, возвращает все устройства, а второй — строковую переменную, в которую выводится результат.
Когда скрипт выполняется, второе окно сообщения содержит список всех устройств, как я и ожидал.
В 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», которое является фактическим результатом запроса.
Любая помощь будет принята с благодарностью.
Второй параметр GetDeviceStatus()
вызов метода в соответствии с VBScript должен передать переменную, которая будет заполнена выводом.
Однако в примере с PHP вы просто передаете строку 'out'
что не эквивалентно тому, что делается в VBScript.
Вместо этого попробуйте передать переменную PHP в метод, а затем отобразить эту переменную на экране, как здесь;
$result = $obj->GetDeviceStatus('', $out);
if ($result)
echo $out."<br />";
После небольшого копания он появляется согласно Справочник по PHP что вам нужно передать переменные по ссылке в COM с помощью VARIANT
тип данных.
Цитата из ferozzahid [at] usa [dot] com на PHP — Функции COM
«Чтобы передать параметр по ссылке на функцию COM, вам нужно передать ему VARIANT. Обычные типы данных, такие как целые числа и строки, для него работать не будут».
Имея это в виду, может быть, это будет работать;
$out = new VARIANT;
$result = $obj->GetDeviceStatus('', $out);
if ($result)
echo $out."<br />";
Других решений пока нет …