天天看点

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 );