我用客户端调用服务器com程序,有谁有通过IDispatch的Invoke()的调用自动化方法实现后期捆绑的代码,谢谢

解决方案 »

  1.   

    只要搞懂invoke各参数你就会调用了~~
    function Invoke(
      DispID: Integer; // DispID参数指定了要执行的方法的调度号,可用GetIDsOfNames得到
      const IID: TGUID; // 此参数无用, 以后或许会有用
      LocaleID: Integer; // 语言页代号, 也可以不予理会
      Flags: Word; // 要执行的方法类型(一般方法/属性读方法/属性写方法/引用赋值方法)  
      var Params; // 参数列表, 下面会继续给出使用方法
      VarResult, // 返回所调用方法的返回值, 指向OleVariant类型
      ExcepInfo, // 指向一个TExcepInfo异常记录, 当invoke返回DISP_E_EXCEPTION时有效
      ArgErr: Pointer // 发生错误用此可知参数列表(Params)中那个参数有误
    ): HResult; stdcall;Params参数列表指针指向一个tagDispParams结构
    tagDISPPARAMS = record
      rgvarg: PVariantArgList;  // 参数列表, 指向一个变体数组, 可用VarArrayCreate构造
      rgdispidNamedArgs: PDispIDList; // 命名参数的调度号列表
      cArgs: Longint; // 参数个数
      cNamedArgs: Longint; // 命名参数个数
    end;
    TDispParams = tagDISPPARAMS;也就是说,调用一个未知的方法,通常需要经过如下几步
    1 用GetIdsOfNames得到方法名的编号
    2 用VarArrayCreate构千一个变体数组,并对各参数赋值
    3 生成一条tagDispParams记录, 其中含有参数信息
    4 根据得到的方法编号及参数列表调用invoke
      

  2.   

    我发这个帖子的目的是想知道,比如我做个com,客户端不注册这个com组件也能调用他的方法,后期捆绑能实现吧?
      能提供个例子吗,我马上给分,谢谢这位仁兄!!!
      

  3.   

    不注册应该也是可以的,只是调用起来比较烦琐,
    你得先CoLoadLibrary该dll, 然后再获得该dll中的DllGetClassObject函数指针,
    然后调用该函数得到类厂,再用得到的类厂创建该类的实例,
    代码大致如下:
      CoInitialize(nil);
      FLibrary := ActiveX.CoLoadLibrary(theDLL, true);
      DllGetClassObject := GetProcAddress(FLibrary, 'DllGetClassObject');
      if DllGetClassObject(CLASS_MyCom, IID_IMyCom, FFactory) = S_OK then
      begin
        FMyCom := FFactory.CreateInstance(nil, IMyCom);
        //FMyCom.DoSomthing;
        ...
      end;
      

  4.   

    westfly(西翔) 对COM理解很透:)
      

  5.   

    我自己知道了,我是用TDcomConnection控件,设置ComputerName和ServeGUID属性,再connect:=true一下,通过appserver访问它的方法就行了
       不管怎么样谢谢这位仁兄