共用方式為


IClassFactory::CreateInstance 方法 (unknwn.h)

建立未初始化的物件。

語法

HRESULT CreateInstance(
  [in]  IUnknown *pUnkOuter,
  [in]  REFIID   riid,
  [out] void     **ppvObject
);

參數

[in] pUnkOuter

如果要建立物件做為匯總的一部分,請指定匯總之控制 IUnknown 介面的指標。 否則,此參數必須是 Null

[in] riid

要用來與新建立之物件通訊之介面識別碼的參考。 如果 pUnkOuterNull,此參數通常是初始化介面的 IID;如果 pUnkOuter 不是Null則 riid 必須IID_IUnknown。

[out] ppvObject

接收 riid中要求的介面指標的指標變數位址。 成功傳回時,*ppvObject 包含要求的介面指標。 如果物件不支援 riid中指定的介面,實作必須將 *ppvObject 設定為 Null

傳回值

這個方法可以傳回標準傳回值E_INVALIDARG、E_OUTOFMEMORY和E_UNEXPECTED,以及下列值。

傳回碼 描述
S_OK
已建立指定的 物件。
CLASS_E_NOAGGREGATION
pUnkOuter參數不是Null,而且物件不支援匯總。
E_NOINTERFACE
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

另請參閱

CoCreateInstance

CoGetClassObject

CoRegisterClassObject

CoRevokeClassObject

IClassFactory