オブジェクト作成拡張機能COMオブジェクトの実装
オブジェクト作成拡張機能は、インプロセスサーバーとして実装されるCOMオブジェクトです。 プライマリとセカンダリの両方のオブジェクト作成拡張機能は、IDsAdminNewObjExtインターフェイスを実装する必要があります。
IDsAdminNewObjExtの実装
オブジェクト作成ウィザードが作成されると、拡張機能のIDsAdminNewObjExt::Initializeメソッドを呼び出すことによって、各オブジェクト作成拡張機能が初期化されます。 Initializeメソッドは、オブジェクトが作成されているコンテナーに関する情報、新しいオブジェクトのクラス名、およびウィザード自体に関する情報を拡張機能に提供します。 既存のオブジェクトから新しいオブジェクトを作成するためにオブジェクト作成ウィザードが開始された場合、pADsCopySourceパラメーターはNULLになりません。 この場合、拡張機能は、コピーされるオブジェクトから可能な限り多くのデータを取得しようとする必要があります。
拡張機能が初期化されると、IDsAdminNewObjExt::AddPagesメソッドが呼び出されます。 拡張機能は、このメソッドの実行中にページをウィザードに追加する必要があります。 ウィザードページは、PROPSHEETPAGE構造体に入力し、この構造体をCreatePropertySheetPage 次に、 lpfnAddPage パラメーターでAddPagesに渡されるコールバック関数を呼び出すことによって、ページがウィザードに追加されます。
拡張機能ページが表示される前に、IDsAdminNewObjExt::SetObjectが呼び出されます。 これにより、作成されるオブジェクトのIADsインターフェイスポインターが拡張機能に提供されます。
ウィザードページが表示されている間、ページはPSN_SETACTIVEやPSN_WIZNEXTなどの必要なウィザード通知メッセージを処理して応答する必要があります。
ユーザーがすべてのウィザードページを完了すると、入力したデータの概要を示す"完了"ページが表示されます。 ウィザードは、各拡張機能に対してIDsAdminNewObjExt::GetSummaryInfoメソッドを呼び出すことによって、このデータを取得します。 GetSummaryInfoメソッドは、"完了"ページに表示されるテキストデータを含むBSTRを提供します。 オブジェクト作成拡張機能では、概要データを指定する必要はありません。 この場合、GetSummaryInfoはE_NOTIMPLを返す必要があります。 GetSummaryInfo は、ページごとではなく、各拡張機能に対して1回だけ呼び出されます。そのため、オブジェクト作成拡張機能が複数のページを追加する場合、拡張機能は概要データを1つの文字列に結合する必要があります。
ユーザーが [完了] ページの 完了ボタンをクリックすると、ウィザードはDSA_NEWOBJ_CTX_PRECOMMITコンテキストを使用して、拡張機能の各IDsAdminNewObjExt::WriteDataメソッドを呼び出します。 この場合、拡張機能は、IADs::Put または IADs::PutEx メソッドを使用して、収集されたデータを適切なプロパティに書き込む必要があります。 IADsインターフェイスは、IDsAdminNewObjExt::SetObjectメソッドで拡張機能に提供されます。 拡張機能は、IADs::SetInfoを呼び出すことによって、キャッシュされたプロパティをコミットしないでください。 すべてのプロパティが書き込まれると、プライマリオブジェクト作成拡張機能はIADs::SetInfoを呼び出すことによって変更をコミットします。 これについては、以下で詳しく説明します。
エラーが発生した場合は、IDsAdminNewObjExt::OnErrorメソッドが呼び出されたときに発生したエラーと操作が拡張機能に通知されます。
プライマリオブジェクト作成ウィザードの実装
プライマリオブジェクト作成ウィザードの実装は、プライマリオブジェクト作成ウィザードでいくつかの手順を実行する必要がある点を除いて、セカンダリオブジェクト作成ウィザードと同じです。
最初のページを閉じる前に、オブジェクト作成ウィザードで一時ディレクトリオブジェクトを作成する必要があります。 これを行うには、IDsAdminNewObjPrimarySite::CreateNew メソッドを呼び出します。 IDsAdminNewObjPrimarySiteインターフェイスへのポインターは、IDsAdminNewObjExt::Initializeに渡されるIDsAdminNewObjインターフェイスでIID_IDsAdminNewObjPrimarySiteを指定してQueryInterfaceを呼び出すことによって取得されます。 CreateNewメソッドは、新しい一時オブジェクトを作成し、拡張機能ごとにIDsAdminNewObjExt::SetObjectを呼び出します。
オブジェクト作成ウィザードに複数のページが含まれている場合、システムは、保存するオブジェクト情報の概要を表示する"完了"ページを実装します。 [完了] ページの 完了ボタンをクリックすると、システムは各オブジェクト作成拡張機能のIDsAdminNewObjExt::WriteDataメソッドを呼び出し、一時オブジェクトを永続メモリにコミットします。 しかし、オブジェクト作成ウィザードが1ページしか含んでいない場合、そのページには、通常ウィザードにある戻る、次へ、キャンセルボタンの代わりに、OKとキャンセルボタンがあり、[完了] ページは提供されません。 このため、単一ページのオブジェクト作成拡張機能ウィザードでは、書き込み操作と保存操作を実行するためにIDsAdminNewObjPrimarySite::Commitを呼び出す必要があります。 単一ページのプライマリオブジェクト作成拡張機能は、PSN_WIZFINISH通知に応答してCommitを呼び出す必要があります。
他のオブジェクト作成拡張機能はウィザードにページを追加できるため、プライマリオブジェクト作成拡張機能は、ウィザードに複数のページがあるかどうかを認識できない場合があります。 これは、次の2つの理由で問題になりません。まず、システムが"完了"ページを実装している場合、プライマリオブジェクト作成拡張機能はPSN_WIZNEXT 通知ではなくPSN_WIZNEXT通知を受け取ります。 第二に、Commitはウィザードが複数のページを含んでいる場合、無害な失敗をします。