用SDK玩转ActiveX
2006-04-11 22:54:07 来源:WEB开发网4. 在CSink::Invoke中有着大量的条件判断,这是为了代码的严谨,从调度ID、参数类型、参数个数等几个方面来确定本次调用无误之后才调用OnHide。也就是说,CSink::Invoke和CSink::OnHide完全可以写成这个样子:
STDMETHODIMP CSink::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
{
if ( 7 == dispIdMember )
{
OnHide();
}
return S_OK;
}
void CSink::OnHide()
{
PostMessage( g_hDlgMain, WM_CLOSE, 0, 0 );
}
看起来的确是简单多了,不过我还是建议你使用前面的方法。
连接点的设置
连接点的使用非常简单,很模式化的代码:
// 设置连接点的过程开始
IConnectionPointContainer *pCPC = NULL;
// 查询连接点容器
hr = pAgent->QueryInterface( IID_IConnectionPointContainer, (void **)&pCPC );
// 查找连接点
hr = pCPC->FindConnectionPoint( __uuidof( _AgentEvents ), &pCP );
// 这时连接点容器已经没用了,释放之
pCPC->Release();
pCPC = NULL;
// 创建通知对象
CSink *pSink = new CSink;
hr = pSink->QueryInterface( IID_IUnknown, (void **)&pSinkUnk );
// 对连接点进行设置
hr = pCP->Advise( pSinkUnk, &dwCookie );
需要注意的是,这段代码必须放在pAgent->put_Connected之后,否则连接点的设置就会失败。另外,这段代码中有几个变量是定义在回调函数头部的static变量,如下:
static IConnectionPoint *pCP = NULL;
static IUnknown *pSinkUnk = NULL;
static DWORD dwCookie = 0;
在程序结束的时候,这样释放连接点:
pCP->Unadvise( dwCookie );
pCP->Release();
pSinkUnk->Release();
需要注意的是pSinkUnk->Release()一句。由于先前进行了接口查询QueryInterface使得引用计数增加,所以必须在结束使用的时候调用Release。
到现在为止,调用ActiveX的大致过程和原理我已经介绍完了。由于示例工程的代码是一段一段地根据文章逻辑而无序引用的,所以这可能会给诸位带来实现上的麻烦,在此李马给大家赔个不是。
更多精彩
赞助商链接