【问题标题】:Pass By Reference to COM Object in PHP在 PHP 中通过引用传递给 COM 对象
【发布时间】:2016-06-06 09:48:27
【问题描述】:

所以我希望有人可以提供帮助,我敢肯定这可能是我所缺少的一些简单的东西。我正在使用 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 />";

回显结果为 1,因为 result 的值是布尔值并且 GetDeviceStatus 成功。我想不通的是如何得到'out'的值,这是实际的查询结果。

任何帮助将不胜感激。

【问题讨论】:

  • 读取神秘物体的类型库。
  • 在我看来 GetDeviceStatus 期望第二个参数是一个变量,因此它可以将数据传递给它。如果您将 PHP 中的定义与 VBScript 相比,它们是不等价的,在 PHP 中您传递字符串 'out' 而不是像在 VBScript 中那样传递名为 out 的变量。也许尝试在 PHP 中定义一个名为 $out 的变量并将其作为第二个参数传递? $result = $obj-&gt;GetDeviceStatus('', $out);.
  • 按照另一个回复中的建议尝试了这个。 DOTNET 对象似乎没有将值返回给 PHP,因此 $out 变量没有被定义,最终会出现未定义的变量错误。如果您将变量定义为空字符串或 null,它会以空字符串或 null 的形式返回。
  • 另一个回答,另一个问题在哪里?

标签: php .net vbscript


【解决方案1】:

根据 VBScript,GetDeviceStatus() 方法调用的第二个参数应该传递一个变量,该变量将填充输出。 然而,在 PHP 示例中,您只是传递了字符串 'out',这并不等同于 VBScript 中正在执行的操作。

尝试将 PHP 变量传递给方法,然后将该变量回显到屏幕,如下所示;

$result = $obj->GetDeviceStatus('', $out);
if ($result)
  echo $out."<br />";

经过一番挖掘,根据PHP Reference 显示,您需要使用VARIANT 数据类型将By Reference 变量传递给COM。

引用ferozzahid [at] usa [dot] com on PHP - COM Functions

“要通过引用 COM 函数传递参数,您需要将 VARIANT 传递给它。整数和字符串等常见数据类型不适用于它。”

考虑到这一点,也许这会起作用;

$out = new VARIANT;
$result = $obj->GetDeviceStatus('', $out);
if ($result)
  echo $out."<br />";

【讨论】:

  • 我也试过了。结果是两个“未定义的变量:第 x 行中的输出”错误。由于某种原因,它不会定义 php 变量。
  • @N8hack 我无论如何都不是 PHP 专家,但我确实希望它能够工作。
  • @Lakymart 我听到了。不过感谢您的回复。我在VS中打开COM对象并浏览了方法,VS显示的功能如下。 Public Function GetDeviceStatus(sDevice As String, ByRef sStatus As String) As Boolean 在查看其他一些示例后,我发现有人建议 PHP DOTNET 类不支持 ByRef 变量。但这没有任何意义,所以我仍在寻找建议。
  • @N8hack 绝对期待它ByRef 只是看看 VBScript 示例。这就是为什么我建议我做了什么,但如果它不起作用,那么 ByRef 可能无法通过 COM 在 PHP 中工作?
  • @N8hack 已更新答案,希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2017-09-11
  • 2013-08-11
相关资源
最近更新 更多