我正在尝试从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返回结构体的函数?
答案 0 :(得分:2)
PHP只能表达OLE自动化兼容类型; “COM”是用词不当(我的坏),它实际上是一个“OLE自动化”扩展。
您的TBoxRect是一种C结构类型,没有IDispatch或Variant表示,因此PHP无法映射该类型。
如果您创建一个实现IDispatch的包装器类型来代替TBoxRect,那么您将获得更多运气。
如果您不是该COM DLL的作者,那么您可以用另一种语言实现该代理包装器,该语言可以访问TBoxRect并以PHP可以访问的形式返回它(创建包装器对象或包装器数组每个值)。然后,您将使用PHP创建包装器对象的实例,您应该进行设置。