目前被两个问题困扰。希望高手能回答一下。
我自己做了一个客户端,一个进程外的服务器。当客户端调用
hr = AtlAdvise( pUnkCP,pUnk, IID_XXX, &pdw );
的时候,
ATLINLINE ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw)
{
CComPtr<IConnectionPointContainer> pCPC;
CComPtr<IConnectionPoint> pCP;
HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (SUCCEEDED(hRes))
hRes = pCPC->FindConnectionPoint(iid, &pCP);
if (SUCCEEDED(hRes))
hRes = pCP->Advise(pUnk, pdw);
return hRes;
}在pCPC->FindConnectionPoint的时候,在真正调用服务器端的FindConnectionPoint之前,
它会查询一次,ICallFactory,我想知道,这是为什么?在调用我服务器端的FindConnectionPoint之后,
客户端又接着调用查询I_IMarshal两次,和{0000001B-0000-0000-C000-0000000000046}这个接口
我知道如果我自己不是想IMarshal接口,系统会调用CLASID_stdMarshal返回一个标准比编排接口,
所以我就没有对于这两个接口,我的返回值是E_NOINTERFACE.
但是,结果我的客户端的FindConnectionPoint的返回值,就变成了E_NOINTERFACE了。
我想请问,这是怎么回事。
我已经注册了Proxy和stub库了。为什么还会出现这样的问题?

解决方案 »

  1.   

    我个人认为之所以会在调用完毕FindConnectionPoint之后,再调用QueryInterface(IID_Marshal,ppUk)是正常的编排行为。只要注册了proxy-stub,这个接口应该不需要我自己实现。
    但是为什么会出现这样的情况,让我很困惑。
    期盼高手给个答案。
      

  2.   

    你必须在接口属性里显示指定oleautomation才会使用标准marshal接口,否则系统一定会找你的marshal接口,并不是自动的。你返回E_NOINTERFACE只会让com库理解成没有这个连接点接口。
      

  3.   

    接口不是我自己定义的。是官方定义的。我只是来实现这个接口。顺便说一下,我的服务器端,没有用ATL和MFC的对COM的的支持。实现的完成是直接来自对接口的继承。
      

  4.   

    什么叫接口是官方定义的?进程外服务器不也是你自己写的吗?连接点接口是服务器定义的,服务器有义务提供代理存根DLL,如果服务器使用标准marshal接口,它的IDL文件里的接口必须有oleautomation属性。检查一下吧。
      

  5.   

    在pCPC-> FindConnectionPoint的时候,在真正调用服务器端的FindConnectionPoint之前, 
    它会查询一次,ICallFactory,我想知道,这是为什么?///
    这里是在创建服务端组件剩下的一个问题,我同意jameshooo 所说的你要实现的接口,你自己是可以看到接口定义的,找一找
      

  6.   

    codeproject上有一系列文章叫COM plan in C其中有一篇讲的就是这个看看对你应该有些帮助
      

  7.   

    感谢各位的帮助。问题已经解决。
    To jameshooo :
       问题可能不是出在你说的地方。我反复跟踪了QueryInterface()发现在查询每个接口之前都会依次查询
             IMarshal,
            {0000001B-0000-0000-C000-0000000000046},
            IStdMarshalInfo,
    这些都是正常的Marshalling过程。即使是普通的[in]接口也是有这个过程的。