【问题标题】:PHP COM function returns struct gives Error [0x80070057] The parameter is incorrectPHP COM函数返回struct给出错误[0x80070057]参数不正确
【发布时间】:2010-11-16 16:18:46
【问题描述】:

我正在尝试从 PHP 的自定义 COM DLL 调用函数 Size()。该函数应返回一个具有 4 个成员(上、左、下、右)的结构,但是当我从 PHP 调用该函数时,出现以下错误:

错误[0x80070057]参数为 不正确。

我没有向它传递任何参数,根据规范,它不应该获取任何参数,而是返回一个结构。

我能够从同一个 COM DLL 成功调用其他 COM 函数。

如果我从 PHP 中调用 com_print_typeinfo(),我可以看到 PHP 认为函数定义如下:

function Size( ) { } /* DISPID=3 */ 

如果我在 VS 2005 中打开 tlb 文件,它会显示为

Function Size() As TBoxRect

它表明TBoxRect 是一个有 4 个成员的结构,就像它应该的那样。

所以 PHP 似乎认为该函数没有返回任何不正确的结果。如何使这个应该使用 COM 从 PHP 返回结构的函数工作?

【问题讨论】:

    标签: php com


    【解决方案1】:

    PHP 只能表达 OLE 自动化兼容类型; “COM”用词不当(我的错),它实际上是一个“OLE 自动化”扩展。

    您的 TBoxRect 是一个没有 IDispatch 或 Variant 表示的 C 结构类型,因此 PHP 无法映射该类型。

    如果你创建一个实现 IDispatch 的包装器类型来代替 TBoxRect,你会有更多的运气。

    如果您不是该 COM DLL 的作者,那么您可以用另一种可以访问 TBoxRect 的语言来实现该代理包装器,并以 PHP 可以访问的形式返回它(创建一个包装器对象,或者为每个值)。然后,您将让 PHP 创建一个包装器对象的实例,并且您应该进行设置。

    【讨论】:

    • COM DLL 的作者制作了一个实现 IDispatch 的包装器,现在它可以在 PHP 中正常工作。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 2020-04-20
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多