一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

一、找到事件对用的DISPID

二、添加委托类

复制代码
 1 #pragma once
 2 #include "oaidl.h"
 3 #include <WinUser.h >
 4 #include "testEventCtrl.h"
 5 #define WM_NEWUSER        4
 6 #define WM_CONNECT        6
 7  
 8 class Skin :
 9     public IDispatch
10 {
11 public:
12     Skin(void);
13     ~Skin(void);
14  
15     CtestEventCtrl *pCtrl;
16  
17     STDMETHODIMP Skin::QueryInterface(const struct _GUID &iid,void ** ppv)
18     {
19         *ppv=this;
20         return S_OK;
21     }
22  
23     ULONG __stdcall Skin::AddRef(void)
24     {    return 1;    }    // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的
25  
26     ULONG __stdcall Skin::Release(void)
27     {    return 0;    }    // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的
28  
29     STDMETHODIMP Skin::GetTypeInfoCount(unsigned int *)
30     {    return E_NOTIMPL;    }    // 不用实现,反正也不用
31  
32     STDMETHODIMP Skin::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** )
33     {    return E_NOTIMPL;    }    // 不用实现,反正也不用
34  
35     STDMETHODIMP Skin::GetIDsOfNames(const IID &,LPOLESTR *,UINT,LCID,DISPID *)
36     {    return E_NOTIMPL;    }    // 不用实现,反正也不用
37  
38     STDMETHODIMP Skin::Invoke(
39         long dispID,
40         const struct _GUID &,
41         unsigned long,
42         unsigned short,
43         struct tagDISPPARAMS * pParams,
44         struct tagVARIANT *,
45         struct tagEXCEPINFO *,
46         unsigned int *)
47     {        // 只需要实现这个就足够啦
48         switch(dispID)    // 根据不同的dispID,完成不同的回调函数
49         {
50         case 4:
51             {
52                 VARIANT varlValue;
53                 long lValue = 0;
54                 varlValue = (pParams->rgvarg)[0];
55                 lValue = V_I4(&varlValue);
56  
57                 ::PostMessage(pCtrl->m_hWnd,WM_NEWUSER,NULL,lValue);
58             }    
59             break;
60         case 6:
61             
62             ::PostMessage(pCtrl->m_hWnd,WM_CONNECT,NULL,NULL);
63             break;
64         
65         default:    
66             break;
67         }
68         return S_OK;
69     }
70  
71 };
复制代码

三、控制类中接收派发的消息

1 BEGIN_MESSAGE_MAP(CtestEventCtrl, COleControl)
2     ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
3     ON_MESSAGE(WM_NEWUSER,OnNewUser)
4     ON_MESSAGE(WM_CONNECT,OnConnect)
5 END_MESSAGE_MAP()

四、查找连接点

复制代码
 1 IZKEMPtr m_ZkFace;
 2  
 3     HRESULT hr = S_OK;
 4     hr = m_ZkFace.CreateInstance(__uuidof(CZKEM));
 5  
 6  
 7     if(hr==S_FALSE)
 8     {
 9         AfxMessageBox(_T("初始化失败!"));
10         return -1;
11     }
12  
13      
14     IConnectionPointContainer *pCPC;
15     hr = m_ZkFace->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPC);
16     if(!SUCCEEDED(hr))
17     {
18         return -1;
19     }
20     IConnectionPoint *pCP;
21     const IID iIID=__uuidof(_IZKEMEvents);
22     hr = pCPC->FindConnectionPoint(iIID,&pCP);
23 //获取连接点
复制代码
复制代码
 1     if(!SUCCEEDED(hr) )
 2     {
 3         return -1;
 4     }
 5     pCPC->Release();
 6  
 7     IUnknown *pSinkUnk;
 8     Skin *pSink = new Skin();
 9     pSink->pCtrl=this;
10     hr = pSink->QueryInterface(IID_IUnknown,(void **)&pSinkUnk);
11     DWORD dwAdvise;
12     hr = pCP->Advise(pSinkUnk,&dwAdvise);//注册其接收接口指针
复制代码

 

posted on   一杯清酒邀明月  阅读(321)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示