複製鏈接
請複製以下鏈接發送給好友

CoCreateInstance

鎖定
CoCreateInstance,函數名。用指定的類標識符創建一個Com對象,用指定的類標識符創建一個未初始化的對象。當在本機中只創建一個對象時,可以調用CoCreateInstance;在遠程系統中創建一個對象時,可以調用CoCreateInstanceEx;創建多個同一CLSID的對象時, 可以參考 CoGetClassObject 函數。
中文名
CoCreateInstance
歸    類
windows系統API函數
功能描述
創建一個Com對象
函數原形
STDAPI CoCreateInstance(

CoCreateInstance函數功能描述

函數原形
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
riid
[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.

CoCreateInstance實例

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,
(LPVOID)&pRet);
if (SUCCEEDED(hr))
{
// 卸載不用的COM服務.
CoFreeUnusedLibraries();
}
else
...
...
pRet->Release();
CoUninitialize();

CoCreateInstance要求

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