Реализация com-объекта расширения создания объектов
Расширение создания объектов — это COM-объект, реализованный как сервер в proc. Расширения создания первичных и вторичных объектов должны реализовывать идентификаторы Администратор ИнтерфейсNewObjExt.
Реализация идентификаторов Администратор NewObjExt
При создании мастера создания объектов он инициализирует каждое расширение создания объекта путем вызова идентификаторов расширения Администратор NewObjExt::Initialize. Метод Initialize предоставляет расширение с информацией о контейнере, в которой создается объект, имя класса нового объекта и сведения о самом мастере. Если мастер создания объектов запускается для создания нового объекта из существующего объекта, параметр pADsCopySource не будет иметь значение NULL. В этом случае расширение должно попытаться получить столько данных из объекта, сколько это возможно.
После инициализации расширения вызывается метод ID Администратор NewObjExt::AddPages. Расширение должно добавить страницу или страницы в мастер во время этого метода. Страница мастера создается путем заполнения структуры PROPSHEETPAGE и передачи этой структуры функции CreatePropertySheetPage. Затем страница добавляется в мастер, вызывая функцию обратного вызова, передаваемую в AddPages в параметре lpfnAddPage.
Перед отображением страницы расширения вызывается идентификаторы Администратор NewObjExt::SetObject. Это предоставляет расширение с указателем интерфейса IADs для создаваемого объекта.
При отображении страницы мастера страница должна обрабатывать и реагировать на все необходимые сообщения уведомления мастера, такие как PSN_SETACTIVE и PSN_WIZNEXT.
Когда пользователь завершает все страницы мастера, мастер отобразит страницу "Готово", которая содержит сводку введенных данных. Мастер получает эти данные путем вызова идентификаторов Администратор NewObjExt::GetSummaryInfo для каждого из расширений. Метод GetSummaryInfo предоставляет BSTR , содержащий текстовые данные, отображаемые на странице "Готово". Расширение создания объекта не требует предоставления сводных данных. В этом случае GetSummaryInfo должен возвращать E_NOTIMPL. GetSummaryInfo вызывается только один раз для каждого расширения, а не для каждой страницы, поэтому если расширение создания объекта добавляет несколько страниц, расширение должно объединить сводные данные в одну строку.
Когда пользователь нажимает кнопку "Готово" на странице "Готово", мастер вызывает каждый идентификатор расширения Администратор МетодыNewObjExt::WriteData с контекстом DSA_NEWOBJ_CTX_PRECOMMIT. При этом расширение должно записывать собранные данные в соответствующие свойства с помощью метода IADs::P ut или IADs::P utEx. Интерфейс IADs предоставляется расширению в методе ID Администратор NewObjExt::SetObject. Расширение не должно фиксировать кэшированные свойства путем вызова IADs::SetInfo. Когда все свойства были записаны, расширение создания первичного объекта фиксирует изменения путем вызова IADs::SetInfo. Это подробно описано ниже.
Если возникает ошибка, расширение будет уведомлено об ошибке и во время операции, которая произошла при вызове идентификаторов Администратор NewObjExt::OnError метод.
Реализация мастера создания первичного объекта
Реализация мастера создания первичного объекта идентична мастеру создания вторичных объектов, за исключением того, что мастер создания первичного объекта должен выполнить несколько действий.
Перед закрытием первой страницы мастер создания объектов должен создать временный объект каталога. Для этого вызовите идентификаторы Администратор МетодNewObjPrimarySite::CreateNew. Указатель на идентификаторы Администратор ИнтерфейсNewObjPrimarySite получается путем вызова QueryInterface с IID_IDsАдминистратор NewObjPrimarySite на интерфейсе ID Администратор NewObj, который передается в идентификаторы Администратор NewObjExt::Initialize. Метод CreateNew создает временный объект и вызывает идентификаторы Администратор NewObjExt::SetObject для каждого расширения.
Когда мастер создания объектов содержит несколько страниц, система реализует страницу "Готово", которая отображает сводку сведений об объекте, которые необходимо сохранить. После нажатия кнопки "Готово" на странице "Готово" система вызовет все идентификаторы расширения создания объекта Администратор МетодNewObjExt::WriteData и зафиксирует временный объект в постоянную память. Однако если мастер создания объектов содержит только одну страницу, страница будет иметь кнопки "ОК" и "Отмена" вместо кнопки "Назад", "Далее" и "Отмена", обычно найденные в мастере, и страница "Готово" не указана. Из-за этого мастер создания одностраничного объекта должен вызывать идентификаторы Администратор NewObjPrimarySite::Commit для выполнения операций записи и сохранения. Расширение создания основного объекта с одной страницей должно вызывать Commit в ответ на уведомление PSN_WIZFINISH .
Так как другие расширения создания объектов могут добавлять страницы в мастер, расширение создания первичного объекта может не знать, существует ли в мастере несколько страниц. Это не проблема по двум причинам: во-первых, если система реализует страницу "Готово", основное расширение создания объекта получит уведомление PSN_WIZNEXT вместо уведомления PSN_WIZNEXT. Во-вторых, фиксация завершится безвредно, если мастер содержит несколько страниц.