.net — передача по ссылке на COM-объект в стеке переполнения

Поэтому я надеюсь, что кто-то может помочь, и я уверен, что это, вероятно, что-то простое, что я скучаю. Я использую 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», которое является фактическим результатом запроса.

Любая помощь будет принята с благодарностью.

1

Решение

Второй параметр 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 />";
0

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

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

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