客户端调用COM, 实现接口调用和COM事件通知
2010-01-17 18:13
375 查看
//################################################ // 必须要注意的是: // (1) 必须要用 #import "XXXX/HelloWorld.dll", 此时彼编译,编译器会生成 // helloworld.tlh, helloworld.tli // // (2) 必须要设置命名空间 using namespace HelloWorldLib; //################################################ // 必须要实现下面的接口 class coCallBack: public IDispatch { public: virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* [out] */ UINT *pctinfo) { return E_NOTIMPL; } virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, /* [out] */ ITypeInfo **ppTInfo) { return E_NOTIMPL; } virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* [in] */ REFIID riid, /* [size_is][in] */ LPOLESTR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, /* [size_is][out] */ DISPID *rgDispId) { return E_NOTIMPL; } virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS *pDispParams, /* [out] */ VARIANT *pVarResult, /* [out] */ EXCEPINFO *pExcepInfo, /* [out] */ UINT *puArgErr) { MessageBox(NULL, "1111111", "2222222", MB_OK); return S_OK; } STDMETHOD_(ULONG, AddRef)() { return E_NOTIMPL; } STDMETHOD_(ULONG, Release)() { return E_NOTIMPL; } STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObject) { *ppvObject = this; //调试发现 return S_OK; } }; coCallBack gpcallback; int _tmain(int argc, _TCHAR* argv[]) { CoInitialize(NULL); // 获DLL中接口类的对象 IhelloATLControlPtr lcmHelloObj; HRESULT hRt = lcmHelloObj.CreateInstance( __uuidof(helloATLControl) ); if (hRt == S_OK) { // 执行导出函数功能 lcmHelloObj->ExportFun1(); } // 把本程序的回调类, 添加到 COM 中的连接容器中(vect 中),COM 中调用容器中的所有类回调函数,通知Client IConnectionPointContainer *lpConnectionPointContainer = NULL; lcmHelloObj.QueryInterface(IID_IConnectionPointContainer, (void **)&lpConnectionPointContainer ); if(lpConnectionPointContainer) { IConnectionPoint *lpConnectionPoint=NULL; lpConnectionPointContainer->FindConnectionPoint ( __uuidof(_IhelloATLControlEvents), &lpConnectionPoint); lpConnectionPointContainer->Release(); lpConnectionPointContainer = NULL; if (lpConnectionPoint) { DWORD ldwCookie=0; // 添加到COM中的类容器中 lpConnectionPoint->Advise( &gpcallback, &ldwCookie); } } lcmHelloObj->ExportFun1(); lcmHelloObj = NULL; CoUninitialize(); return 0; }
相关文章推荐
- 一种类似Retrofit声明接口即可实现调用的WebApi客户端框架
- COM实现系统SENS接口获取网络断开事件
- OPC客户端调用时提示“无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型”...
- asp.net 利用 ajaxpro.2.dll 实现客户端调用后台事件
- Apache CXF实现web service接口+客户端调用
- (C#,COM)调用某com组件报实现类无法强制转换成接口的的问题
- 一句代码调用注册通知事件+实现微信弹出/隐藏输入框
- javaweb 服务器 提供SOAP协议接口,android客户端调用代码实现过程
- Axis2实现web service接口开发+客户端调用
- 进程外COM组件实现IRpcChannelBuffer接口,客户端通过代理接口跨进程调用(有代码)
- Axis2实现 web service接口开发 + 客户端调用
- 通过BEGIN_COM_MAP看接口的三剑客的实现和调用(AC8)
- Java 调用C# webservice接口 生成java客户端 实现方式
- jersey实现web service接口+客户端调用
- Axis实现 web service接口开发 + 客户端调用
- WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“客户端界面与之绑定的控件值”也发生改变需要实现INotitypropertyChanged接口)
- COM 组件实现事件、通知
- SpringMVC 结合HttpClient调用第三方接口实现
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(二)------------信封加密与解密
- 接口存在多个实现类时的动态调用