다음을 통해 공유


개체 만들기 확장 COM 개체 구현

개체 만들기 확장은 in-proc 서버로 구현된 COM 개체입니다. 기본 및 보조 개체 만들기 확장은 모두 IDsAdminNewObjExt 인터페이스를 구현해야 합니다.

IDsAdminNewObjExt 구현

개체 만들기 마법사를 만들면 확장의 IDsAdminNewObjExt::Initialize 메서드를 호출하여 각 개체 만들기 확장을 초기화합니다. Initialize 메서드는 개체가 만들어지는 컨테이너에 대한 정보, 새 개체의 클래스 이름 및 마법사 자체에 대한 정보를 확장에 제공합니다. 개체 만들기 마법사가 기존 개체에서 새 개체를 만들기 시작하면 pADsCopySource 매개 변수는 NULL이 아닙니다. 이 경우 확장은 가능한 한 복사되는 개체에서 많은 데이터를 가져오려고 시도해야 합니다.

확장이 초기화되면 IDsAdminNewObjExt::AddPages 메서드가 호출됩니다. 확장은 이 메서드 중에 마법사에 페이지 또는 페이지를 추가해야 합니다. 마법사 페이지는 PROPSHEETPAGE 구조를 입력한 다음 이 구조를 CreatePropertySheetPage 함수에 전달하여 생성됩니다. 그런 다음 lpfnAddPage 매개 변수의 AddPages에 전달되는 콜백 함수를 호출하여 페이지가 마법사에 추가됩니다.

확장 페이지가 표시되기 전에 IDsAdminNewObjExt::SetObject 가 호출됩니다. 이렇게 하면 생성되는 개체에 대한 IAD 인터페이스 포인터가 확장에 제공됩니다.

마법사 페이지가 표시되는 동안 페이지는 PSN_SETACTIVEPSN_WIZNEXT 같은 필요한 마법사 알림 메시지를 처리하고 응답해야 합니다.

사용자가 모든 마법사 페이지를 완료하면 입력한 데이터의 요약을 제공하는 "마침" 페이지가 마법사에 표시됩니다. 마법사는 각 확장에 대해 IDsAdminNewObjExt::GetSummaryInfo 메서드를 호출하여 이 데이터를 가져옵니다. GetSummaryInfo 메서드는 "마침" 페이지에 표시되는 텍스트 데이터를 포함하는 BSTR을 제공합니다. 개체 만들기 확장 프로그램은 요약 데이터를 제공할 필요가 없습니다. 이 경우 GetSummaryInfoE_NOTIMPL 반환해야 합니다. GetSummaryInfo 는 페이지당이 아닌 각 확장에 대해 한 번만 호출되므로 개체 만들기 확장에서 둘 이상의 페이지를 추가하는 경우 확장은 요약 데이터를 하나의 문자열로 결합해야 합니다.

사용자가 "마침" 페이지에서 마침 단추를 클릭하면 마법사는 DSA_NEWOBJ_CTX_PRECOMMIT 컨텍스트를 사용하여 확장의 각 IDsAdminNewObjExt::WriteData 메서드를 호출합니다. 이 경우 확장은 IADs::P ut 또는 IADs::PutEx 메서드를 사용하여 수집된 데이터를 적절한 속성에 기록해야 합니다. IDsAdminNewObjExt::SetObject 메서드의 확장에 IADs 인터페이스가 제공됩니다. 확장은 IAD::SetInfo를 호출하여 캐시된 속성을 커밋해서는 안 됩니다. 모든 속성이 기록되면 기본 개체 만들기 확장 프로그램은 IADs::SetInfo를 호출하여 변경 내용을 커밋합니다. 이 내용은 아래에서 자세히 설명합니다.

오류가 발생하면 확장에 오류와 IDsAdminNewObjExt::OnError 메서드가 호출될 때 발생한 작업에 대한 알림이 표시됩니다.

기본 개체 만들기 마법사 구현

기본 개체 만들기 마법사의 구현은 보조 개체 만들기 마법사와 동일합니다. 단, 기본 개체 만들기 마법사는 몇 가지 단계를 더 수행해야 합니다.

첫 번째 페이지를 해제하기 전에 개체 만들기 마법사에서 임시 디렉터리 개체를 만들어야 합니다. 이렇게 하려면 IDsAdminNewObjPrimarySite::CreateNew 메서드를 호출합니다. IDsAdminNewObjPrimarySite 인터페이스에 대한 포인터는 IDsAdminNewObjExt::Initialize에 전달되는 IDsAdminNewObj 인터페이스에서 IID_IDsAdminNewObjPrimarySite사용하여 QueryInterface를 호출하여 가져옵니다. CreateNew 메서드는 새 임시 개체를 만들고 각 확장에 대해 IDsAdminNewObjExt::SetObject를 호출합니다.

개체 만들기 마법사에 둘 이상의 페이지가 포함된 경우 시스템은 저장할 개체 정보의 요약을 표시하는 "마침" 페이지를 구현합니다. " 마침" 페이지의 마침 단추를 클릭하면 시스템에서 각 개체 만들기 확장의 IDsAdminNewObjExt::WriteData 메서드를 호출한 다음 임시 개체를 영구 메모리에 커밋합니다. 그러나 개체 만들기 마법사에 하나의 페이지만 포함된 경우 페이지에는 일반적으로 마법사에서 찾을 수 있는 뒤로, 다음취소 단추 대신 확인취소 단추가 있으며 "마침" 페이지가 제공되지 않습니다. 이 때문에 단일 페이지 개체 만들기 확장 마법사는 IDsAdminNewObjPrimarySite::Commit 을 호출하여 쓰기 및 저장 작업을 수행해야 합니다. 단일 페이지 기본 개체 만들기 확장은 PSN_WIZFINISH 알림에 대한 응답으로 Commit을 호출해야 합니다.

다른 개체 만들기 확장은 마법사에 페이지를 추가할 수 있으므로 기본 개체 만들기 확장은 마법사에 둘 이상의 페이지가 있는지 모를 수 있습니다. 이는 두 가지 이유로 문제가 되지 않습니다. 첫째, 시스템에서 "마침" 페이지를 구현하는 경우 기본 개체 만들기 확장은 PSN_WIZNEXT 알림 대신 PSN_WIZNEXT 알림을 받습니다. 둘째, 마법사에 둘 이상의 페이지가 포함된 경우 커밋 이 무해하게 실패합니다.