C++ 调用COM连接点步骤

写个博客,防止自己又搞忘记了。见代码.

  //核心代码,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;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值