// 完整的COM例子

來源:互聯網
上載者:User

// 完整的COM例子

#include <unknwn.h>
#include <iostream.h>
#include <objbase.h>

void Trace (const char* msg)
{
 cout << msg << endl;
}

/*注意這裡為了實現多態都介面都使用了虛函數*/
/*使用_stdcall支援DLL調用*/
// interface
interface IX : IUnknown
{
 virtual void _stdcall Fx() = 0; 
};

interface IY : IUnknown
{
 virtual void _stdcall Fy() = 0; 
};

interface IZ : IUnknown
{
 virtual void _stdcall Fz() = 0; 
};

// Forward references for GUIDs
extern const IID IDD_IX;
extern const IID IDD_IY;
extern const IID IDD_IZ;

 

// component
class CA : public IX,
     public IY
{
/*從介面繼承而來的都應該是虛函數,由於基類已經聲明了virtual關鍵字,這裡可以省略*/
public:
 // IUnknown
 HRESULT _stdcall QueryInterface (const IID& iid, void ** ppv);
 ULONG _stdcall AddRef (void)
 {
  return 0;
 }

 ULONG _stdcall Release(void)
 {
  return 0;
 }
 
 // IX
 void _stdcall Fx()
 {
  cout << "Fx" << endl;
 }

 // IY
 void _stdcall Fy()
 {
  cout << "Fy" << endl;
 }

};

// GUID
// {6134635D-4669-4c4b-BEB3-9223591AE918}
static const GUID IID_IX =
{ 0x6134635d, 0x4669, 0x4c4b, { 0xbe, 0xb3, 0x92, 0x23, 0x59, 0x1a, 0xe9, 0x18 } };
// {D90FD541-D995-4303-9A07-1CC54C6BA576}
static const GUID IID_IY =
{ 0xd90fd541, 0xd995, 0x4303, { 0x9a, 0x7, 0x1c, 0xc5, 0x4c, 0x6b, 0xa5, 0x76 } };
// {F881374D-98D7-48a2-AA72-373A988AF3D9}
static const GUID IID_IZ =
{ 0xf881374d, 0x98d7, 0x48a2, { 0xaa, 0x72, 0x37, 0x3a, 0x98, 0x8a, 0xf3, 0xd9 } };

 

HRESULT _stdcall CA::QueryInterface(const IID& iid, void ** ppv)
{
 if(IID_IUnknown == iid) 
 {
  Trace("QueryInterface: return pointer to IUnknow.");
//  *ppv = static_cast<IUnknown* > (this);  IUnknown是一個虛類不能產生執行個體
  *ppv = static_cast<IX* > (this);
 }
 else if(IID_IX == iid)
 {
  Trace("QueryInterface: return pointer to IX.");
  *ppv = static_cast<IX* > (this);
 }
 else if(IID_IY == iid)
 {
  Trace("QueryInterface: return pointer to IY.");
  *ppv = static_cast<IY* > (this);
 }
 else
 {
  Trace("QueryInterface: no interface.");
  *ppv = NULL;
  return E_NOINTERFACE;
 }
 // reinterpret_cast操作符修改了運算元類型,但僅僅是重新解釋了給出的對象的位元模型而沒有進行二進位轉換
 reinterpret_cast<IUnknown* > (*ppv)->AddRef();   // 疑問
 
 return S_OK;
}

// Creation function
IUnknown * CreateInstance()
{
 IUnknown * pI = static_cast<IX*>(new CA);
 pI->AddRef();
 return pI;
}

int main()
{
 HRESULT hr;

// 方式一
 Trace("Client: Get an IUnKnow pointer");
 IUnknown * pIUnknown = CreateInstance();
 Trace("Client: Get interface IX");
 
// 方式二
 // 擷取IX
 IX * pIX = NULL;
 hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
 if(SUCCEEDED(hr))
 {
  Trace("Client: Succeeded getting IX");
  pIX->Fx();  // Use interface IX
 }
 else
 {
  Trace("Client: Could not get interface IX");
 }

 // 擷取IY
 IY * pIY = NULL;
 hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
 if(SUCCEEDED(hr))
 {
  Trace("Client: Succeeded getting IY");
  pIY->Fy();  // Use interface IY
 }
 else
 {
  Trace("Client: Could not get interface IY");
 }

 Trace("Client: ask for an unsupported interface");
 IZ * pIZ = NULL;
 hr = pIUnknown->QueryInterface(IID_IZ, (void**)&pIZ);
 if(SUCCEEDED(hr))
 {
  Trace("Client: Succeeded getting IZ");
  pIX->Fx();  // Use interface IX
 }
 else
 {
  Trace("Client: Could not get interface IZ");
 }

 Trace("Client: Get interface IY from interface IX");
 IY * pIYfromIX = NULL;
 hr = pIX->QueryInterface(IID_IY, (void**)&pIYfromIX);
 if(SUCCEEDED(hr))
 {
  Trace("Client: Succeeded getting IY");
  pIYfromIX->Fy();
 }

 IUnknown * pIUnknownFromIY = NULL;
 hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUnknownFromIY);
 if(SUCCEEDED(hr))
 {
  cout << "are the IUnknown pointers equal ?" << endl;
  if(pIUnknownFromIY == pIUnknown)
  {
   cout << "yes,pIUnknownFromIY == pIUnknown" << endl;
  }
  else
  {
   cout << "no,pIUnknownFromIY != pIUnknown" << endl;
  }
 }

 delete pIUnknown;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.