Implementar el objeto COM de la extensión de creación de objetos
Una extensión de creación de objetos es un objeto COM implementado como un servidor en proceso. Las extensiones de creación de objetos principal y secundario deben implementar la interfaz IDsAdminNewObjExt .
Implementación de IDsAdminNewObjExt
Cuando se crea el Asistente para la creación de objetos, inicializa cada extensión de creación de objetos llamando al método IDsAdminNewObjExt::Initialize de la extensión. El método Initialize proporciona la extensión con información sobre el contenedor en el que se está creando el objeto, el nombre de clase del nuevo objeto e información sobre el propio asistente. Si se inicia el asistente para la creación de objetos para crear un nuevo objeto a partir de un objeto existente, el parámetro pADsCopySource no será NULL. En este caso, la extensión debe intentar obtener tantos datos del objeto que se copian como sea factible.
Una vez inicializada la extensión, se llama al método IDsAdminNewObjExt::AddPages . La extensión debe agregar la página o las páginas al asistente durante este método. Se crea una página del asistente rellenando una estructura PROPSHEETPAGE y pasando esta estructura a la función CreatePropertySheetPage . A continuación, la página se agrega al asistente llamando a la función de devolución de llamada que se pasa a AddPages en el parámetro lpfnAddPage .
Antes de que se muestre la página de extensión, se llama a IDsAdminNewObjExt::SetObject . Esto proporciona la extensión con un puntero de interfaz de IADs para el objeto que se va a crear.
Mientras se muestra la página del asistente, la página debe controlar y responder a los mensajes de notificación del asistente necesarios, como PSN_SETACTIVE y PSN_WIZNEXT.
Cuando el usuario complete todas las páginas del asistente, el asistente mostrará una página "Finalizar" que proporciona un resumen de los datos especificados. El asistente obtiene estos datos llamando al método IDsAdminNewObjExt::GetSummaryInfo para cada una de las extensiones. El método GetSummaryInfo proporciona un BSTR que contiene los datos de texto mostrados en la página "Finalizar". Una extensión de creación de objetos no tiene que proporcionar datos de resumen. En este caso, GetSummaryInfo debe devolver E_NOTIMPL. GetSummaryInfo solo se llama una vez para cada extensión, no por página, por lo que si la extensión de creación de objetos agrega más de una página, la extensión debe combinar los datos de resumen en una cadena.
Cuando el usuario hace clic en el botón Finalizar de la página "Finalizar", el asistente llama a cada uno de los métodos IDsAdminNewObjExt::WriteData de la extensión con el contexto de DSA_NEWOBJ_CTX_PRECOMMIT . Cuando esto ocurre, la extensión debe escribir los datos recopilados en las propiedades adecuadas mediante el método IADs::P ut o IADs::P utEx . La interfaz iaDs se proporciona a la extensión en el método IDsAdminNewObjExt::SetObject . La extensión no debe confirmar las propiedades almacenadas en caché llamando a IADs::SetInfo. Cuando se han escrito todas las propiedades, la extensión de creación de objetos principal confirma los cambios llamando a IADs::SetInfo. Esto se describe con más detalle a continuación.
Si se produce un error, se notificará el error a la extensión y durante la operación que se produjo cuando se llame al método IDsAdminNewObjExt::OnError .
Implementación de un Asistente para la creación de objetos principales
La implementación de un asistente para la creación de objetos principal es idéntica a un asistente para la creación de objetos secundarios, salvo que un asistente para la creación de objetos principal debe realizar algunos pasos más.
Antes de descartar la primera página, el Asistente para la creación de objetos debe crear el objeto de directorio temporal. Para ello, llame al método IDsAdminNewObjPrimarySite::CreateNew . Se obtiene un puntero a la interfaz IDsAdminNewObjPrimarySite llamando a QueryInterface con IID_IDsAdminNewObjPrimarySite en la interfaz IDsAdminNewObj que se pasa a IDsAdminNewObjExt::Initialize. El método CreateNew crea un nuevo objeto temporal y llama a IDsAdminNewObjExt::SetObject para cada extensión.
Cuando un asistente para la creación de objetos contiene más de una página, el sistema implementa una página "Finalizar" que muestra un resumen de la información del objeto que se va a guardar. Cuando se hace clic en el botón Finalizar de la página "Finalizar", el sistema llamará a cada uno de los IDsAdminNewObjExt::WriteData de la extensión de creación de objetos y, a continuación, confirmará el objeto temporal en la memoria persistente. Sin embargo, si el asistente para la creación de objetos solo contiene una página, la página tendrá botones Aceptar y Cancelar en lugar de los botones Atrás, Siguiente y Cancelar que se encuentran normalmente en un asistente y no se proporciona ninguna página "Finalizar". Por este motivo, un asistente para la extensión de creación de objetos de página única debe llamar a IDsAdminNewObjPrimarySite::Commit para realizar las operaciones de escritura y guardado. Una extensión de creación de objetos primarios de página única debe llamar a Commit en respuesta a la notificación PSN_WIZFINISH .
Dado que otras extensiones de creación de objetos pueden agregar páginas al asistente, es posible que la extensión de creación de objetos principal no sepa si hay más de una página en el asistente. Esto no es un problema por dos motivos: en primer lugar, si el sistema implementa la página "Finalizar", la extensión de creación de objetos principal recibirá la notificación PSN_WIZNEXT en lugar de la notificación de PSN_WIZNEXT . En segundo lugar, la confirmación producirá un error inofensivo si el asistente contiene más de una página.