天天看點

COM學習筆記七《COM技術内幕》§7 —— 類廠、COM庫

 《COM技術内幕》 §7 —— 類廠、COM庫

CoCreateInstance的聲明:

HRESULT __stdcall CoCreateInstance(

   const CLSID&   clsid,    

   IUnknown*   pIUnknownOuter,

   DWORD   dwClsContext,

   const IID&   iid,        

   void**   ppv

);

CoCreateInstance有四個輸入參數和一個輸出參數。第一個參數是待建立元件的CLSID。第二個參數是用于聚合元件的。第三個參數的作用是限定所建立的元件的執行上下文。第四個參數iid為元件上待使用的接口的IID。CoCreateInstance将在最後一個參數中傳回此接口的指針。通過将一個IID傳給CoCreateInstance,客戶将無需在建立元件之後去調用其QueryInterface函數。

CoCreateInstance的使用:

// Create Component

IX* pIX = NULL;

HRESULT hr = :: CoCreateInstance( CLSID_Component1,

                             NULL,

                             CLSCTX_INPROC_SERVER,

                             IID_IX,

                             (void**)&pIX);

If(SUCCEEDED(hr))

{

pIX->Fx();

pIX->Release();

}

          傳給CoCreateInstance的最後兩個參數同傳給QueryInterface的參數是一樣的。

CoCreateInstance的第三個參數dwClsContext(類上下文)可以控制所建立的元件是在與客戶相同的程序中運作,還是在不同的程序中運作,或者是在另外一台機器上運作。其取值為下列各值的組合:

CLSCTX_INPROC_SERVER

客戶希望建立在同一程序中運作的元件。為能夠同客戶在同一程序中運作,組建必須是在DLL中實作的。

CLSCTX_INPROC_HANDLER

客戶希望建立程序中處理器。一個程序甲處理器實際上是一個隻實作了某個元件一部分的程序中元件。該元件的其他部分将由本地或遠端伺服器上的某個程序外元件實作。

CLSCTX_LOCAL_SERVER

客戶希望建立一個在同一機器上的另外一個程序中運作的元件。本地伺服器是由EXE實作的。

CLSCTX_REMOTE_SERVER

客戶希望建立一個在遠端機器上運作的元件。此标志需要分布式COM正常工作。

與《COM原理與應用》中第三章的例子程式相對比,《COM技術内幕》第七章的的程式的共同的部分:

(1)客戶程式(有待改進):

int main()

{

// CoInitialize();

// CoCreateInstance();

// CoUninitialize();

}

(2)COM程式

// Interfaces Definition

// Component Class Declaration

// Component Class Functions Implementation for IUnknown Interfaces

// {

         // QueryInterface(const IID& iid, void** ppv);

         // AddRef( );

         // Release( );

// }

// Component Class Functions Implementation for IClassFactory Interfaces

// {

         // IUnknown Interface

         // QueryInterface(const IID& iid, void** ppv);

         // AddRef( );

         // Release( );

         // IClassFactory Interface

         // CreateInstance (IUnknown *pUnknownOuter, const IID& iid, void **ppv);

         // LockServer(BOOL bLock);

// }

// Exported functions

// DllCanUnloadNow( );     // Can DLL Unload Now?

// DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv);     //Get Class Factory

// Server Registation

// DllRegisterServer( );

// Server Unregistation

// DllUnregisterServer( );

// DLL Module Information

// DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved );