描述:
Server IDL如下:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(871870A0-63C8-4C92-9106-4E9F003588D6),
helpstring("ICalcComm Interface"),
pointer_default(unique)
]
interface ICalcComm : IUnknown
{
[helpstring("method CalcSqr")] HRESULT CalcSqr([in] int i_In,[out] int * i_Out);
};
[
object,
uuid(871870A0-63C8-4C92-9106-4E9F003588D7),
helpstring("ICalcCommEvent Interface"),
pointer_default(unique)
]
interface ICalcCommEvent : IUnknown
{
[helpstring("method GetCurrentDate")] HRESULT GetCurrentDate([in] int * idate);
};
[
uuid(4BB635E5-96F7-45EA-B053-7EECEDAC7488),
version(1.0),
helpstring("ComServer 1.0 Type Library")
]
library COMSERVERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(3AD41525-AF3A-470C-B4E2-816E09E14988),
helpstring("CalcComm Class")
]
coclass CalcComm
{
[default] interface ICalcComm;
[source] interface ICalcCommEvent;
};
};
Client端如下:
hResult = pContainer->FindConnectionPoint(callid, &m_pConnectionPoint);
上句返回值为S_OK,
hResult = m_pConnectionPoint->Advise((IUnknown*)m_ICallBack,
&m_dwCookie);
时,跳转到
HRESULT IConnectionEvent::QueryInterface(REFIID riid,
void** ppv)
{
// riid = Marsel ?
if(riid == IID_IUnknown)
{
*ppv = (IUnknown*)((ICalcCommEvent*)this);
}
else if(riid == IID_ICalcCommEvent)
{
*ppv = (ICalcCommEvent*)this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
// AddRef();
return S_OK;
}
中riid参数为IID_IMarshal
晕了,SOS
解决方案1:
用ATL呀, 帮你自动实现连接点. 以下是ATL生成的IDL
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(26DB472B-E9BD-4BF2-B1B7-419691A532F1),
dual,
helpstring("Iaa Interface"),
pointer_default(unique)
]
interface Iaa : IDispatch
{
};
[
uuid(E7782A10-6AB2-4FB9-B850-5DB975C7F6AA),
version(1.0),
helpstring("sss 1.0 Type Library")
]
library SSSLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(5C54892A-1E9B-4B34-9358-4E9A0CA24A35),
helpstring("_IaaEvents Interface")
]
dispinterface _IaaEvents
{
properties:
methods:
[id(1), helpstring("method event")] HRESULT event();
};
[
uuid(6BC50F76-DB01-4420-B98C-62477AF0E824),
helpstring("aa Class")
]
coclass aa
{
[default] interface Iaa;
[default, source] dispinterface _IaaEvents;
};
};
去看COM 组件设计与应用系列文章中关于连接点的介绍,http://www.vckbase.com/网站。