CoCreateInstanceEx常用於創建遠程組件,因爲考慮到遠程訪問時要在網絡上來回傳遞信息,所以此函數允許一次詢多個接口。
CoCreateInstanceEx參數說明
共有如下六個參數,分別爲:
REFCLSID rclsid:指定要實例化COM組件的GUID
IUnknown *punkOuter:
DWORD dwClsCtx:指定服務器組件的類型,可以爲以下值:
CLSCTX_INPROC_SERVER:指明組件與客戶端程序運行在同一進程中,組件服務器是一個DLL。如果組件遠行在遠和計算機上,將在本地啓動一個代理服務器程序或代理。
CLSTX_INPROC_HANDLER:指明組件是一個遠程的,但有本地客戶羰程序的類結構的實現。
CLSCTX_LOCAL_SERVER:指明服務器程序是一個本地的可執行文件;因此,運行在一個單獨的里程中。
CLSCTX_REMOTE_SERVER:指明組件服務器運行在不同的遠程計算機上,組件是在遠程計算機上創建和管理的。
COSERVERINFO *pServerInfo:指明服務器信息,它爲一個結構,定義如下:
typedef struct _COSERVERINFO
{
DWORD dwReserved1; //保留
LPWSTR pwszName; //指定遠程計算機名
COAUTHINFO *pAuthInfo; //
DWORD dwReserved2; //保留
} COSERVERINFO;
ULONG cmq:指明要查詢接口的個數。
MULTI_QI *pResults:用於接收查詢到的接口,可以爲數組,以接收多個接口。
2.2.2. CoCreateInstanceEx調用實例:
HRESULT hr ;
COSERVERINFO si ;
MULTI_QI mqi [2] ;
WCHAR* wServerName = L "192.168.0.1 ";
TCHAR szBuffer[512];
ICM* pICM = NULL;
ICA* pICA = NULL;
::ZeroMemory(&szBuffer, 512);
si.pwszName = wServerName ;
si.dwReserved1 = 0 ;
si.pAuthInfo = NULL ;
si.dwReserved2 = 0;
mqi [0].pIID = &IID_ICM ;
mqi [0].pItf = NULL ;
mqi [0].hr = 0 ;
mqi [1].pIID = &IID_ICA;
mqi [1].pItf = NULL ;
mqi [1].hr = 0 ;
hr = CoCreateInstanceEx (
CLSID_Account,
NULL,
CLSCTX_LOCAL_SERVER,
&si,
2,
mqi) ;
if (hr != S_OK)
{
::MessageBox(m_hWnd, “組件實例化失敗!”, "錯誤 ", MB_ICONSTOP) ;
return FALSE;
}
pICM = (ICM*) mqi[0].pItf ;
pICA = (ICA*) mqi[1].pItf ;
CoCreateInstance的用法
CoCreateInstance
HRESULT __stdcall CoCreateInstance(
const CLSID& clsid,
IUnknown* pIUnknownOuter,
DWORD dwClsContext,
const IID& iid,
void** ppw
);
dwClsContext值:
CLSCTX_INPROC_SERVER
客戶希望創建在同一進和中運行的組件。爲能夠同客戶在同一進程中運行,組件必須
是在DLL中實現的。
CLSCTX_INPROC_HANDLER
客戶希望創建進程中處理器。一個進程中處理器實際上是一個只實現了某個組件一部分的
進程中組件。該組件的其他部分將由本地或遠程服務器上的某個進程外組件實現。
CLSCTX_LOCAL_SERVER
客戶希望創建一個在同一機器上的另外一個進程中運行的組件。本地服務器由EXE實現的。
CLSCTX_REMOTE_SERVER
客戶希望創建一個在遠程機器上運行的組件。此標誌需要分佈式COM正常工作。