Implementieren des COM-Objekts für die Objekterstellungserweiterung

Eine Objekterstellungserweiterung ist ein COM-Objekt, das als In-Proc-Server implementiert wird. Sowohl primäre als auch sekundäre Objekterstellungserweiterungen müssen die IDsAdminNewObjExt-Schnittstelle implementieren.

Implementieren von IDsAdminNewObjExt

Wenn der Objekterstellungs-Assistent erstellt wird, wird jede Objekterstellungserweiterung initialisiert, indem die IDsAdminNewObjExt::Initialize-Methode der Erweiterung aufgerufen wird. Die Initialize-Methode stellt die Erweiterung mit Informationen zum Container bereit, in dem das Objekt erstellt wird, den Klassennamen des neuen Objekts und Informationen zum Assistenten selbst. Wenn der Objekterstellungs-Assistent gestartet wird, um ein neues Objekt aus einem vorhandenen Objekt zu erstellen, ist der pADsCopySource-Parameter nicht NULL. In diesem Fall sollte die Erweiterung versuchen, so viele Daten aus dem zu kopierenden Objekt wie möglich abzurufen.

Nachdem die Erweiterung initialisiert wurde, wird die IDsAdminNewObjExt::AddPages-Methode aufgerufen. Die Erweiterung muss die Seite(n) während dieser Methode dem Assistenten hinzufügen. Eine Assistentenseite wird erstellt, indem eine PROPSHEETPAGE-Struktur ausgefüllt und diese Struktur dann an die CreatePropertySheetPage-Funktion übergeben wird. Die Seite wird dann dem Assistenten hinzugefügt, indem die Rückruffunktion aufgerufen wird, die im Parameter lpfnAddPage an AddPages übergeben wird.

Bevor die Erweiterungsseite angezeigt wird, wird IDsAdminNewObjExt::SetObject aufgerufen. Dadurch wird die Erweiterung mit einem IADs-Schnittstellenzeiger für das zu erstellende Objekt bereitgestellt.

Während die Assistentenseite angezeigt wird, sollte die Seite alle erforderlichen Benachrichtigungen des Assistenten verarbeiten und darauf reagieren, z. B. PSN_SETACTIVE und PSN_WIZNEXT.

Wenn der Benutzer alle Assistentenseiten abgeschlossen hat, zeigt der Assistent eine Seite "Fertig stellen" an, die eine Zusammenfassung der eingegebenen Daten enthält. Der Assistent ruft diese Daten ab, indem die IDsAdminNewObjExt::GetSummaryInfo-Methode für jede der Erweiterungen aufgerufen wird. Die GetSummaryInfo-Methode stellt einen BSTR bereit, der die Textdaten enthält, die auf der Seite "Fertig stellen" angezeigt werden. Eine Objekterstellungserweiterung muss keine Zusammenfassungsdaten bereitstellen. In diesem Fall sollte GetSummaryInfoE_NOTIMPL zurückgeben. GetSummaryInfo wird nur einmal für jede Erweiterung aufgerufen, nicht pro Seite. Wenn die Objekterstellungserweiterung also mehr als eine Seite hinzufügt, muss die Erweiterung die Zusammenfassungsdaten in einer Zeichenfolge kombinieren.

Wenn der Benutzer auf der Seite "Fertig stellen" auf die Schaltfläche Fertig stellen klickt, ruft der Assistent jede der IDsAdminNewObjExt::WriteData-Methoden der Erweiterung mit dem DSA_NEWOBJ_CTX_PRECOMMIT Kontext auf. In diesem Fall sollte die Erweiterung die gesammelten Daten mithilfe der IADs::P ut- oder IADs::P utEx-Methode in die entsprechenden Eigenschaften schreiben. Die IADs-Schnittstelle wird für die Erweiterung in der IDsAdminNewObjExt::SetObject-Methode bereitgestellt. Die Erweiterung sollte die zwischengespeicherten Eigenschaften nicht durch Aufrufen von IADs::SetInfo committen. Wenn alle Eigenschaften geschrieben wurden, führt die primäre Objekterstellungserweiterung einen Commit für die Änderungen durch den Aufruf von IADs::SetInfo aus. Dies wird unten ausführlicher erläutert.

Wenn ein Fehler auftritt, wird die Erweiterung über den Fehler und den Vorgang benachrichtigt, der aufgetreten ist, wenn die IDsAdminNewObjExt::OnError-Methode aufgerufen wird.

Implementieren eines Assistenten zum Erstellen eines primären Objekts

Die Implementierung eines Assistenten zum Erstellen eines primären Objekts ist identisch mit einem Assistenten zum Erstellen sekundärer Objekte, mit der Ausnahme, dass ein Assistent zum Erstellen eines primären Objekts einige weitere Schritte ausführen muss.

Bevor die erste Seite geschlossen wird, muss der Objekterstellungs-Assistent das temporäre Verzeichnisobjekt erstellen. Rufen Sie hierzu die IDsAdminNewObjPrimarySite::CreateNew-Methode auf. Ein Zeiger auf die IDsAdminNewObjPrimarySite-Schnittstelle wird abgerufen, indem QueryInterface mit IID_IDsAdminNewObjPrimarySite für die IDsAdminNewObj-Schnittstelle aufgerufen wird, die an IDsAdminNewObjExt::Initialize übergeben wird. Die CreateNew-Methode erstellt ein neues temporäres Objekt und ruft IDsAdminNewObjExt::SetObject für jede Erweiterung auf.

Wenn ein Objekterstellungs-Assistent mehrere Seiten enthält, implementiert das System eine Seite "Fertig stellen", auf der eine Zusammenfassung der zu speichernden Objektinformationen angezeigt wird. Wenn auf die Schaltfläche Fertig stellen auf der Seite "Fertig stellen" geklickt wird, ruft das System die IDsAdminNewObjExt::WriteData-Methode der Objekterstellungserweiterung auf und committen dann das temporäre Objekt in den persistenten Speicher. Wenn der Objekterstellungs-Assistent jedoch nur eine Seite enthält, verfügt die Seite über die Schaltflächen OK und Abbrechen anstelle der Schaltflächen Zurück, Weiter und Abbrechen , die normalerweise in einem Assistenten zu finden sind, und es wird keine Seite "Fertig stellen" bereitgestellt. Aus diesem Grund muss ein Assistent zum Erstellen von Einzelseitenobjekterweiterungen IDsAdminNewObjPrimarySite::Commit aufrufen, um die Schreib- und Speichervorgänge auszuführen. Eine Erweiterung für die Erstellung eines primären Einzelseitenobjekts sollte Commit als Reaktion auf die PSN_WIZFINISH-Benachrichtigung aufrufen.

Da andere Objekterstellungserweiterungen dem Assistenten Seiten hinzufügen können, weiß die primäre Objekterstellungserweiterung möglicherweise nicht, ob mehr als eine Seite im Assistenten vorhanden ist. Dies ist aus zwei Gründen kein Problem: Erstens, wenn das System die Seite "Fertig stellen" implementiert, erhält die primäre Objekterstellungserweiterung anstelle der PSN_WIZNEXT Benachrichtigung die PSN_WIZNEXT Benachrichtigung. Zweitens schlägt commit harmlos fehl, wenn der Assistent mehr als eine Seite enthält.