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为组件上待使用的接口的IIDCoCreateInstance将在最后一个参数中返回此接口的指。通将一个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
();
 
}
 
 
2COM程序
 
// 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 )

 

猜你喜欢

转载自blog.csdn.net/dengrk/article/details/1942526