`
fqov84fqov
  • 浏览: 7952 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

《COM技术内幕》代码之 组件与客户程序的划分

 
阅读更多

  公共部分:
  IFace.h #pragma once #include  interface IX : public IUnknown { virtual void _stdcall Fx() = 0; }; interface IY : public IUnknown { virtual void _stdcall Fy() = 0; }; interface IZ : public IUnknown { virtual void _stdcall Fz() = 0; }; extern "C" { extern const IID IID_IX; extern const IID IID_IY; extern const IID IID_IZ; }; Guids.cpp #include  extern "C" { extern const IID IID_IX = {0xec53e1de, 0x37d, 0x48f5, {0xa1, 0xee, 0x2d, 0xf5, 0xa5, 0xde, 0xf3, 0x49}}; // {EC53E1DE-037D-48f5-A1EE-2DF5A5DEF349} extern const IID IID_IY = {0x4c510b77, 0xc63a, 0x4e0f, {0xa2, 0x45, 0x7b, 0x21, 0x23, 0x12, 0x23, 0xe7}};// {4C510B77-C63A-4e0f-A245-7B21231223E7} extern const IID IID_IZ = {0xefb1f8d4, 0x674e, 0x4123, {0xa9, 0x19, 0x3c, 0x72, 0xee, 0xe8, 0x1d, 0x92}};// {EFB1F8D4-674E-4123-A919-3C72EEE81D92} }  组件部分:
  Component.h #pragma once #include "IFace.h" #include  using namespace std; class CA : public IX, public IY { public: CA() : m_cRef(0){ }; ~CA() { } public: virtual HRESULT _stdcall QueryInterface(REFIID riid, __RPC__deref_out void **ppvObject); virtual ULONG _stdcall AddRef(); virtual ULONG _stdcall Release(); virtual void _stdcall Fx() { cout(this); } else if(IID_IY == riid) { *ppvObject = static_cast(this); } else if(IID_IUnknown == riid) { *ppvObject = static_cast(this); } else { *ppvObject = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppvObject)->AddRef(); return S_OK; } ULONG _stdcall CA::AddRef() { InterlockedIncrement(&m_cRef); return m_cRef; } ULONG _stdcall CA::Release() { if(InterlockedDecrement(&m_cRef) == 0) { delete this; return 0; } return m_cRef; } 客户部分:
  Client.cpp #include "Component.h" //这个函数应在组件部分 放在Component.h中link2005错误(重复定义) 放到Component.cpp中找不到定义 extern "C" IUnknown* CreateInstance() { IUnknown *pIUnk = static_cast(new CA); pIUnk->AddRef(); return pIUnk; } void _tmain(int argc,_TCHAR*argv[]) { IUnknown *pIUnk = CreateInstance(); IX *pIX = NULL; HRESULT hr = pIUnk->QueryInterface(IID_IX,(void**)&pIX); if(SUCCEEDED(hr)) { pIX->Fx(); pIX->Release(); } IY *pIY = NULL; hr = pIUnk->QueryInterface(IID_IY,(void**)&pIY); if(SUCCEEDED(hr)) { pIY->Fy(); pIY->Release(); } IZ *pIZ = NULL; hr = pIUnk->QueryInterface(IID_IZ,(void**)&pIZ); if(SUCCEEDED(hr)) { coutRelease(); } pIUnk->Release(); }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics