代码之家  ›  专栏  ›  技术社区  ›  Sancarn

是否可以使用本机元编程的自定义IDispatch?

  •  0
  • Sancarn  · 技术社区  · 5 年前

    最近我一直在研究 IDispatch 作品。下面是自动化客户端如何调用自动化服务器对象的方法的示例,该对象实现 分发接口 :

    HRESULT hresult;
    IDispatch * pdisp = (IDispatch *)NULL;
    DISPID dispid;
    OLECHAR * szMember = "color";
    
    // Code that sets a pointer to the dispatch (pdisp) is omitted.
    
    hresult = pdisp->GetIDsOfNames(
       IID_NULL,
       &szMember,
       1, LOCALE_SYSTEM_DEFAULT,
       &dispid);
    
    pdisp->Invoke(
       dispid,
       ...
    )
    

    在实现服务器时,这向我建议您可以实现 GetIDOfNames 作为:

    HRESULT GetIDsOfNames(
      REFIID   riid,
      LPOLESTR *rgszNames,
      UINT     cNames,
      LCID     lcid,
      DISPID   *rgDispId
    ){
      rgDispId = 10;
      return S_OK;
    };
    

    通过这种方式,我们告诉客户机,本质上,所有方法调用都是正常的,并且所有方法调用都将使用 DISPID==10 .

    myObject->a();
    myObject->ab();
    myObject->abc();
    myObject->abcd();
    //^^ Are all valid and will all call DispID 10.
    

    所以我的问题是,我们能不能以某种方式存储被调用的名称,这样我们的DispID 10方法就能知道调用的是哪个方法?


    注意:这项工作的最终目标是构建一个COM服务器,该服务器能够成为其他COM客户机的COM服务器,而这些客户机本身可能缺乏成为COM服务器的能力/知识。

    0 回复  |  直到 5 年前