函式功能描述:
用指定的類標識符創建一個Com對象,用指定的類標識符創建一個未初始化的對象。當在本機中只創建一個對象時,可以調用CoCreateInstance;在遠程系統中創建一個對象時,可以調用CoCreateInstanceEx;創建多個同一CLSID的對象時, 可以參考 CoGetClassObject 函式。
函式原形:
STDAPI CoCreateInstance(
REFCLSID rclsid, //創建的Com對象的類標識符(CLSID)
LPUNKNOWN pUnkOuter, //指向接口IUnknown的指針
DWORD dwClsContext, //運行可執行代碼的上下文
REFIID riid, //創建的Com對象的接口標識符
LPVOID * ppv //用來接收指向Com對象接口地址的指針變數
);
參數:
rclsid
[in] 用來唯一標識一個對象的CLSID(128位),需要用它來創建指定對象。
pUnkOuter
[in] 如果為NULL, 表明此對象不是聚合式對象一部分。如果不是NULL, 則指針指向一個聚合式對象的IUnKnown接口。
dwClsContext
[in] 組件類別. 可使用CLSCTX枚舉器中預定義的值.
可選取值如下:
CLSCTX_INPROC_SERVER | 創建在同一進程中運行的組件。為能夠同一進程中運行, 組件必須是在DLL中實現的。 |
CLSCTX_INPROC_HANDLER | 創建進程中處理器。一個進程中處理器實際上是一個 只實現了某個組建一部分的進程中組件。該組件的其他部分將 由本地或遠程伺服器上的某個進程外組件實現。 |
CLSCTX_LOCAL_SERVER | 創建一個在同一機器上的另外一個進程中運行的組件。 本地伺服器是由exe實現的。 |
CLSCTX_REMOTE_SERVER | 創建一個在遠程機器上運行的組件。此標誌需要分散式 COM正常工作。 |
CLSCTX_INPROC | CLSCTX_LOCAL_SERVER CLSCTX_INPROC_HANDLER |
CLSCTX_ALL | CLSCTX_INPROC_SERVER CLSCTX_INPROC_HANDLER CLSCTX_LOCAL_SERVER CLSCTX_REMOTE_SERVER |
CLSCTX_SERVER | CLSCTX_INPROC_SERVER CLSCTX_LOCAL_SERVER CLSCTX_REMOTE_SERVER |
[in] 引用接口標識符,用來與對象通信。
ppv
[out] 用來接收指向接口地址的指針變數。如果函式調用成功,*ppv包括請求的接口指針。
返回值:
S_OK
指定的Com對象實例被成功創建。
REGDB_E_CLASSNOTREG
指定的類沒有在註冊表中註冊. 也可能是指定的dwClsContext沒有註冊或註冊表中的伺服器類型損壞
CLASS_E_NOAGGREGATION
這個類不能創建為聚合型。
E_NOINTERFACE
指定的類沒有實現請求的接口, 或者是IUnknown接口沒有暴露請求的接口.
注釋:
CoCreateInstance幫助者函式通過使用對象的CLSID,提供了一種便潔的方式與類對象連線,創建未初始化的實例,以及釋放類對象。它封裝了以下的功能:
CoGetClassObject(rclsid,NULL ,dwClsContext, IID_IClassFactory, &pCF);
hresult = pCF->CreateInstance(pUnkOuter, riid, ppvObj);
pCF->Release();
當在本機中只創建一個對象時,調用CoCreateInstance是最方便的;如果要在遠程系統中創建一個對象時,可以調用CoCreateInstanceEx;創建多個同一CLSID的對象時, 可以參考 CoGetClassObject 函式;如果創建多個對象實例,可以獲得類對象的IClassFactory 接口指針,並使用需要的方法,可以使用CoGetClassObject函式。
在CLSCTX枚舉器中, 你可以指定用來管理對象的伺服器類型. 這些常量可以是CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER或是它們的任何組合. 常量CLSCTX_ALL被定義為這三個值的組合. 想獲得更多的有關這些常量的用法,請參考CLSCTX.
實例:
if ( SUCCEEDED( CoInitialize(NULL) ) )
{
// 如果成功初始化COM庫,則繼續初始化並運行應用程式...
// 對於Win32應用程式, CoInitialize函式的pvReserved參數,必須為NULL. 此參數不能被用於32位COM,
// CoInitialize將會返回E_INVALIDARG,如果傳遞一個非NULL參數.
}
else
{
// 如果初始化COM庫失敗,則退出.
}
HRESULT hr;
IComObject *pRet;
hr = CoCreateInstance(CLSID_OFCOM,NULL,CLSCTX_INPROC_SERVER,IID_OFCOMOBJECT,
(PPVOID)&pRet);
if (SUCCEEDED(hr))
{
// 卸載不用的COM服務.
CoFreeUnusedLibraries();
}
else
...
...
pRet->Release();
CoUninitialize();
要求:
Windows NT/2000: 需要 Windows NT 3.1或以後版本。
Windows 95/98: 需要 Windows 95 或以後版本。
頭檔案 : objbase.h.
庫檔案 : ole32.dll.
參看:
CoGetClassObject, IClassFactory::CreateInstance, CoCreateInstanceEx, CLSCTX, (實例創建幫助函式)Instance Creation Helper Functions