Val*_*i S 18 php windows delphi com
我在php中调用COM类中的任何方法都遇到了麻烦.为了找到该类中的所有方法,我使用了:
$com = new COM('Some.Class.Name');
com_print_typeinfo($com);
Run Code Online (Sandbox Code Playgroud)
这个类包含了100种不同的方法.但是当他们打电话时:
$com->SomeMethod();
Run Code Online (Sandbox Code Playgroud)
,弹出这个错误:
致命错误:在第22行的C:\ xampp\htdocs\www\test.php中调用未定义的方法com :: SomeMethod()
当我使用其他COM对象(如" InternetExplorer.Application "类)时,不会发生这种情况.另外,我知道这个COM对象与Delphi等其他编程语言一样可以正常工作.
我在64位Windows Vista上使用PHP 5.5.19,在32位PHP架构上使用XAMPP.
对于这种情况可能发生的事情或一些可能的解决方法,我将不胜感激.
编辑: COM服务器应用程序是用Delphi编写的.
这可能是另一个线索:当我使用代码时
$com = new COM('Some.Class.Name');
foreach ($com as $obj) {
echo $obj->Name . "<br />";
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
致命错误:未捕获的异常'异常',消息'类型为com的对象未创建迭代器'
我想这表明应用程序界面本身可能存在问题,但我不知道该问题可能是什么.我在PHP中工作,所以COM对象的内部对我来说是完全模糊的.但我非常感谢有关具体步骤的任何线索,以解决这种情况.
EDIT2: 这是Srv_TLB.pas文件的简短代码.
unit Srv_TLB;
{$TYPEDADDRESS OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
const
// TypeLibrary Major and minor versions
SrvMajorVersion = 1;
SrvMinorVersion = 0;
LIBID_Srv: TGUID = '{xxxxx-xxx-xxx-xx...}';
IID_ISrvObject: TGUID = '{yyyyy-yyy-yyy-yy..}';
CLASS_SrvObject: TGUID = '{zzzzz-zzz-zzz-z...}';
type
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
ISrvObject = interface;
ISrvObjectDisp = dispinterface;
// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
SrvObject = ISrvObject;
ISrvObject = interface(IDispatch)
['{yyyyy-yyy-yyy-yy..}']
function FuncName1(const param1: WideString; const param2: WideString): Integer; safecall;
function FuncName2: OleVariant; safecall;
function FuncName3(const param: WideString): Integer; safecall;
end;
// *********************************************************************//
// DispIntf: ISrvObjectDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {yyyyy-yyy-yyy-yy..}
// *********************************************************************//
ISrvObjectDisp = dispinterface
['{yyyyy-yyy-yyy-yy..}']
function FuncName1(const param1: WideString; const param2: WideString): Integer; dispid 3;
function FuncName2: OleVariant; dispid 4;
function FuncName3(const param: WideString): Integer; dispid 5;
end;
CoSrvObject = class
class function Create: ISrvObject;
class function CreateRemote(const MachineName: string): ISrvObject;
end;
implementation
uses ComObj;
class function CoSrvObject.Create: ISrvObject;
begin
Result := CreateComObject(CLASS_SrvObject) as ISrvObject;
end;
class function CoSrvObject.CreateRemote(const MachineName: string): ISrvObject;
begin
Result := CreateRemoteComObject(MachineName, CLASS_SrvObject) as ISrvObject;
end;
end.
Run Code Online (Sandbox Code Playgroud)
而问题是(从事物的PHP端):我可以初始化COM对象$com = new COM('The.Class.Name');或$com = new COM('{GUID}');和我得到的类型信息com_print_typeinfo($com);,这样我就可以看到该对象应具备的方法FuncName1(),FuncName2()和FuncName3(),但是当我尝试调用他们中的任何一个$com->FuncName1(param1, param2);,它返回的是这个错误:
致命错误:在第22行的C:\ xampp\htdocs\www\test.php中调用未定义的方法com :: SomeMethod()
COM 可能会出现很多问题,但我会尽力提供帮助。我知道您使用术语来描述问题,例如调用 $com->SomeMethod(),但在这种情况下您需要更具体。
COM 通过两个基本接口 IUnknown 和 IDispatch 公开其类和功能。
它还具有 C 类型的 DLL 结构,以向“外部”世界公开函数(不是方法或类)。
可以通过读取导出表(如 Delphi)直接链接到 DLL 的语言,直接在 COM 公开的接口上进行调用(使用 IUnknown 接口)。
脚本语言(如javascript、PHP python等)无法直接调用接口。相反,他们使用 IDispatch 接口。
该接口充当代理,通过简单文本公开所有 COM 功能。
IDispatch 接口定义以下标准方法:
1. 在其公开的接口上查询 COM
2. 对象的方法名称。
3. 每种方法的参数。
在您的帖子中,您显示 IDispatch 公开了三种方法:
1. FuncName1
2. FuncName2
3. FuncName3
因此,您无法在 ISrvObject 上调用 SomeMethod,因为它不是通过 IDispatch 接口公开的。
注意: COM 在公开其接口时使用 WideString (UTF-16) 文本。一旦您调用接口方法,请考虑这一点。
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |