IClassFactory::CreateInstance 方法 (unknwn.h)
建立未初始化的物件。
語法
HRESULT CreateInstance(
[in] IUnknown *pUnkOuter,
[in] REFIID riid,
[out] void **ppvObject
);
參數
[in] pUnkOuter
如果要建立物件做為匯總的一部分,請指定匯總之控制 IUnknown 介面的指標。 否則,此參數必須是 Null。
[in] riid
要用來與新建立之物件通訊之介面識別碼的參考。 如果 pUnkOuter 為 Null,此參數通常是初始化介面的 IID;如果 pUnkOuter 不是Null, 則 riid 必須IID_IUnknown。
[out] ppvObject
接收 riid中要求的介面指標的指標變數位址。 成功傳回時,*ppvObject 包含要求的介面指標。 如果物件不支援 riid中指定的介面,實作必須將 *ppvObject 設定為 Null。
傳回值
這個方法可以傳回標準傳回值E_INVALIDARG、E_OUTOFMEMORY和E_UNEXPECTED,以及下列值。
傳回碼 | 描述 |
---|---|
|
已建立指定的 物件。 |
|
pUnkOuter參數不是Null,而且物件不支援匯總。 |
|
ppvObject指向的物件不支援riid所識別的介面。 |
備註
COM 伺服器的 CreateInstance 實作必須傳回屬於伺服器 DCOM 解析程式之 Apartment 中所含物件的參考。 它不得傳回遠端 Apartment 中包含的物件參考。
IClassFactory介面一律位於類別物件上。 CreateInstance方法會建立以指定 CLSID 識別之類別的未初始化物件。 以這種方式建立物件時,必須在系統登錄中使用 CoRegisterClassObject 函式註冊 CLSID。
pUnkOuter參數會指出物件是否要建立為匯總的一部分。 不需要物件定義才能支援匯總 - 它們必須特別設計並實作以支援它。
riid參數會指定介面的 IID (介面識別碼) ,以便您用來與新物件通訊。 如果 pUnkOuter 不是Null (表示匯總) ,則 riid 參數的值必須IID_IUnknown。 如果物件不是匯總的一部分,riid 通常會指定要初始化物件的介面。
針對 OLE 內嵌,初始化介面是 IPersistStorage,但在其他情況下,則會使用其他介面。 若要初始化 物件,必須在初始化介面中對適當的方法進行後續呼叫。 常見的初始化函式包括IPersistStorage::InitNew (,) 適用于儲存在檔案) ) 或IPersistFile::Load (儲存在資料流程物件) 或IPers (istFile::) (Load (的物件。
一般而言,如果應用程式只支援一個物件類別,而且類別物件已註冊供單一使用,則只能建立一個物件。 應用程式不得建立其他物件,而且要求這樣做應該從 IClassFactory::CreateInstance傳回錯誤。 同樣地,對於支援多個類別的應用程式而言,每個類別物件都已註冊供單一使用;針對一個類別呼叫 CreateInstance ,後面接著針對任何應該傳回錯誤的類別呼叫 CreateInstance 。
為了避免傳回錯誤,當收到具現化第二個類別的要求時,支援多個具有單用類別物件的應用程式可以藉由呼叫 CoRevokeClassObject 來撤銷第一個類別的已註冊類別物件。 例如,假設有兩個類別 A 和 B。針對類別 A 呼叫 CreateInstance 時,請撤銷 B 的類別物件。建立 B 時,請撤銷 A 的類別物件。此解決方案會使關機複雜,因為其中一個類別物件可能已經撤銷 (,而且無法撤銷兩次) 。
需求
最低支援的用戶端 | Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows 2000 Server [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | unknwn.h |