WEB开发网
开发学院软件开发VC 用SDK玩转ActiveX 阅读

用SDK玩转ActiveX

 2006-04-11 22:54:07 来源:WEB开发网   
核心提示: 4. 在CSink::Invoke中有着大量的条件判断,这是为了代码的严谨,用SDK玩转ActiveX(9),从调度ID、参数类型、参数个数等几个方面来确定本次调用无误之后才调用OnHide,也就是说,由于示例工程的代码是一段一段地根据文章逻辑而无序引用的,所以这可能会给诸位带来实现上的麻

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的大致过程和原理我已经介绍完了。由于示例工程的代码是一段一段地根据文章逻辑而无序引用的,所以这可能会给诸位带来实现上的麻烦,在此李马给大家赔个不是。

上一页  4 5 6 7 8 9 

Tags:SDK ActiveX

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接