C++ 调用COM连接点步骤

本文介绍了一种使用COM组件并通过连接点实现事件响应的方法。通过示例代码详细展示了如何获取组件对象IDispConnect,并利用该对象注册事件处理程序,最终响应自定义事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值