通过引用传递给PHP中的COM对象

时间:2016-02-24 08:05:56

标签: php .net vbscript

所以我希望有人可以提供帮助,我相信这可能是我想念的简单事情。我正在使用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'的值,这是实际的查询结果。

非常感谢任何帮助。

1 个答案:

答案 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 />";