首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >COM对象方法未定义,怎么办?

COM对象方法未定义,怎么办?
EN

Stack Overflow用户
提问于 2018-04-04 01:49:38
回答 1查看 0关注 0票数 0

在php中调用COM类,为了找到该类中的所有方法,我使用了:

代码语言:txt
复制
$com = new COM('Some.Class.Name');
com_print_typeinfo($com);

这个类包含大约100个不同的方法:

代码语言:txt
复制
$com->SomeMethod();

,将弹出此错误:

Fatal error: Uncaught exception 'Exception' with message 'Object of type com did not create an Iterator'

当我使用其他COM对象时,这种情况不会发生,比如‘InternetExplorer.应用“上课。另外,我知道这个COM对象与其他编程语言如Delphi一样工作。

我在64位WindowsVista上使用PHP 5.5.19,在32位PHP架构下使用XAMPP.

当我使用代码时

代码语言:txt
复制
$com = new COM('Some.Class.Name');
foreach ($com as $obj) { 
    echo $obj->Name . "<br />"; 
} 

我得到:Fatal error: Uncaught exception 'Exception' with message 'Object of type com did not create an Iterator'

代码语言:txt
复制
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.
EN

回答 1

Stack Overflow用户

发布于 2018-04-04 11:31:18

您将显示IDis补丁公开了三种方法:

  1. FuncName1
  2. FuncName2
  3. FuncName3

因此,您不能在ISrvObject上调用SomeMethod,因为它不是通过IDis修补程序接口公开的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档