写个博客,防止自己又搞忘记了。见代码.
//核心代码,COM的初始化代码未贴出
//用#import导出ConnectDll.dll
//1、获得自定义组件对象 IDispConnect
//IDispConnect提供函数Add(long, long)
CLSID clsId;
HRESULT hr = CLSIDFromProgID(_T("ConnectDll.DispConnect"), &clsId);
if (FAILED(hr))
{
return;
}
CComPtr<IDispConnect> spDispConn;
spDispConn.CoCreateInstance(clsId);
if (FAILED(hr))
{
return;
}
//2、在对象IDispConnect中查询是否支持连接点
CComQIPtr<IConnectionPointContainer> spDispConnect(spDispConn);
if (spDispConnect == NULL)
{
return;
}
//3、如果支持连接点,获取事件对象。
// 这里第一个参数必须是__uuidof(_IDispConnectEvents)
IConnectionPoint * pConnectPoint;
spDispConnect->FindConnectionPoint(__uuidof(_IDispConnectEvents), &pConnectPoint);
if (pConnectPoint == NULL)
{
return;
}
CSinkConnectPoint sink;//重载IDispatch类
DWORD cok;
pConnectPoint->Advise(&sink, &cok);
spDispConn->Add(3, 5);//此方法调用sink的Invoke函数,事件响应了。
pConnectPoint->Unadvise(cok);
pConnectPoint->Release();
spDispConnect.Release();
spDispConn.Release();
//over
//下面是CSinkConnectPoint::Invoke()的代码
STDMETHODIMP CSinkConnectPoint::Invoke(
long dispID,
const struct _GUID &,
unsigned long,
unsigned short,
struct tagDISPPARAMS * pParams,
struct tagVARIANT *,
struct tagEXCEPINFO *,
unsigned int *)
{ // 只需要实现这个就足够啦
switch(dispID) // 根据不同的dispID,完成不同的回调函数
{
case 1:
{
VARIANTARG *v = pParams->rgvarg;
if (v == NULL)
{
break;
}
CString strMsg;
strMsg.Format(_T("%d"), v[0].lVal);
AfxMessageBox(strMsg);
}
break;
default:
break;
}
return S_OK;
}