所以我希望有人可以提供帮助,我相信这可能是我想念的简单事情。我正在使用PHP访问第三方软件的.net API。
基于关于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有两个周长,第一个是设备目标,如果留空则返回所有设备,第二个是转储结果的字符串变量。
当脚本执行时,第二个消息框包含所有设备的列表,如我所料。
在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 />";
echoing result给出1,因为result的值是一个布尔值,GetDeviceStatus是成功的。我无法弄清楚的是如何获得'out'的值,这是实际的查询结果。
非常感谢任何帮助。
答案 0 :(得分:0)
根据VBScript调用GetDeviceStatus()
方法的第二个参数应该传递一个将用输出填充的变量。
但是在PHP示例中,您只是传递字符串'out'
,这与VBScript中的操作不同。
而是尝试将PHP变量传递给方法,然后将该变量回显到屏幕,就像这样;
$result = $obj->GetDeviceStatus('', $out);
if ($result)
echo $out."<br />";
经过一些挖掘后,根据PHP Reference显示您需要使用VARIANT
数据类型将参考变量传递给COM。
引自ferozzahid [at] usa [dot] com on PHP - COM Functions
“要通过引用COM函数传递参数,需要将VARIANT传递给它。常见的数据类型如整数和字符串将不起作用。”
考虑到这一点,也许这会奏效;
$out = new VARIANT;
$result = $obj->GetDeviceStatus('', $out);
if ($result)
echo $out."<br />";