目前被两个问题困扰。希望高手能回答一下。
我自己做了一个客户端,一个进程外的服务器。当客户端调用
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库了。为什么还会出现这样的问题?
我自己做了一个客户端,一个进程外的服务器。当客户端调用
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库了。为什么还会出现这样的问题?
但是为什么会出现这样的情况,让我很困惑。
期盼高手给个答案。
它会查询一次,ICallFactory,我想知道,这是为什么?///
这里是在创建服务端组件剩下的一个问题,我同意jameshooo 所说的你要实现的接口,你自己是可以看到接口定义的,找一找
To jameshooo :
问题可能不是出在你说的地方。我反复跟踪了QueryInterface()发现在查询每个接口之前都会依次查询
IMarshal,
{0000001B-0000-0000-C000-0000000000046},
IStdMarshalInfo,
这些都是正常的Marshalling过程。即使是普通的[in]接口也是有这个过程的。