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 リゾルバーに属するアパートメントに含まれるオブジェクトへの参照を返す必要があります。 リモート アパートメントに含まれているオブジェクトへの参照を返してはなりません。
IClassFactory インターフェイスは常にクラス オブジェクト上にあります。 CreateInstance メソッドは、指定した CLSID で識別されたクラスの初期化されていないオブジェクトを作成します。 この方法でオブジェクトを作成する場合、CLSID は CoRegisterClassObject 関数を使用してシステム レジストリに登録する必要があります。
pUnkOuter パラメーターは、オブジェクトが集計の一部として作成されているかどうかを示します。 集計をサポートするためにオブジェクト定義は必要ありません。オブジェクト定義は、それをサポートするように特別に設計および実装する必要があります。
riid パラメーターは、新しいオブジェクトと通信するインターフェイスの IID (インターフェイス識別子) を指定します。 pUnkOuter が NULL 以外 (集計を示す) の場合は、riid パラメーターの値をIID_IUnknownする必要があります。 オブジェクトが集計の一部でない場合、riid は多くの場合、オブジェクトを初期化するインターフェイスを指定します。
OLE 埋め込みの場合、初期化インターフェイスは IPersistStorage ですが、他の状況では他のインターフェイスが使用されます。 オブジェクトを初期化するには、初期化インターフェイスで適切なメソッドの後続の呼び出しが必要です。 一般的な初期化関数には、 IPersistStorage::InitNew (新しい空白の埋め込み可能なコンポーネントの場合)、 IPersistStorage::Load (再読み込みされた埋め込み可能なコンポーネントの場合)、 IPersistStream::Load、(ストリーム オブジェクトに格納されているオブジェクトの場合) または IPersistFile::Load (ファイルに格納されているオブジェクトの場合) があります。
一般に、アプリケーションでサポートされているオブジェクトのクラスが 1 つだけであり、そのクラス オブジェクトが単一の使用に登録されている場合、作成できるオブジェクトは 1 つだけです。 アプリケーションは他のオブジェクトを作成しないでください。これを行う要求は 、IClassFactory::CreateInstance からエラーを返す必要があります。 複数のクラスをサポートするアプリケーションでも同じことが当てはまります。各クラス は、1 つの使用に登録されたクラス オブジェクトを持ちます。1 つのクラスに対する CreateInstance の呼び出しの後に、エラーを返すクラスの CreateInstance の呼び出しが続きます。
エラーが返されないようにするために、単一使用クラス オブジェクトを持つ複数のクラスをサポートするアプリケーションは、2 番目のインスタンス化の要求が受信されたときに CoRevokeClassObject を 呼び出すことによって、最初のクラスの登録済みクラス オブジェクトを取り消すことができます。 たとえば、A と B の 2 つのクラスがあるとします。クラス A に対して CreateInstance が呼び出されると、B のクラス オブジェクトを取り消します。B が作成されたら、A のクラス オブジェクトを取り消します。クラス オブジェクトの 1 つが既に取り消されている可能性があるため 、このソリューションではシャットダウンが複雑になります (また、2 回取り消すことはできません)。
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | unknwn.h |