프로젝트 팩터리를 사용하여 프로젝트 인스턴스 만들기
Visual Studio의 프로젝트 형식은 프로젝트 팩터리를 사용하여 프로젝트 개체의 인스턴스를 만듭니다. 프로젝트 팩터리는 공동 생성 가능한 COM 개체에 대한 표준 클래스 팩터리와 유사합니다. 그러나 프로젝트 개체는 공동 생성할 수 없습니다. 프로젝트 팩터리를 사용해야 만들 수 있습니다.
Visual Studio IDE는 사용자가 기존 프로젝트를 로드하거나 Visual Studio에서 새 프로젝트를 만들 때 VSPackage에서 구현된 프로젝트 팩터리를 호출합니다. 새 프로젝트 개체는 IDE에 솔루션 탐색기 채울 수 있는 충분한 정보를 제공합니다. 또한 새 프로젝트 개체는 IDE에서 시작한 모든 관련 UI 작업을 지원하는 데 필요한 인터페이스를 제공합니다.
프로젝트의 클래스에서 IVsProjectFactory 인터페이스를 구현할 수 있습니다. 일반적으로 이 인터페이스는 자체 모듈에 있습니다.
소유자가 집계할 수 있도록 지원하는 프로젝트는 프로젝트 파일에서 소유자 키를 유지해야 합니다. 소유자 키가 있는 프로젝트에서 CreateProject 메서드를 호출하는 경우 소유 프로젝트는 소유자 키를 프로젝트 팩터리 GUID로 변환한 다음, 이 프로젝트 팩터리에서 CreateProject
메서드를 호출하여 실제 만들기를 수행합니다.
소유 프로젝트 만들기
소유자는 다음 두 단계로 소유 프로젝트를 만듭니다.
PreCreateForOwner 메서드 호출. 이렇게 하면 소유 프로젝트에서
IUnknown
을 제어하는 입력을 기반으로 집계된 프로젝트 개체를 만들 수 있습니다 . 소유 프로젝트는 내부IUnknown
및 집계된 개체를 소유자 프로젝트에 다시 전달합니다. 이렇게 하면 소유 프로젝트에서 내부IUnknown
를 저장할 수 있습니다.InitializeForOwner 메서드 호출. 소유 프로젝트는 소유되지 않은 프로젝트의 경우처럼
IVsProjectFactory::CreateProject
를 호출하는 대신 이 메서드가 호출될 때 모든 인스턴스화를 수행합니다. 입력VSOWNEDPROJECTOBJECT
열거형은 일반적으로 집계된 소유 프로젝트입니다. 소유 프로젝트는 이 변수를 사용하여 프로젝트 개체가 이미 만들어졌는지(쿠키가 NULL과 같지 않음), 아니면 만들어야 하는지(쿠키는 NULL과 같음) 확인할 수 있습니다.프로젝트 형식은 공동 생성 가능한 COM 개체의 CLSID와 유사한 고유한 프로젝트 GUID로 식별됩니다. 일반적으로 하나의 프로젝트 팩터리는 단일 프로젝트 형식의 인스턴스 만들기를 처리하지만 하나의 프로젝트 팩터리에서 둘 이상의 프로젝트 형식 GUID를 처리하도록 할 수 있습니다.
프로젝트 형식은 특정 파일 이름 확장명과 연결됩니다. 사용자가 기존 프로젝트 파일을 열려고 하거나 템플릿을 복제하여 새 프로젝트를 만들려고 하면 IDE는 파일의 확장명을 사용하여 해당 프로젝트 GUID를 확인합니다.
IDE는 새 프로젝트를 만들어야 하는지, 아니면 특정 형식의 기존 프로젝트를 열어야 하는지 결정하는 즉시 [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] 아래의 시스템 레지스트리에 있는 정보를 사용하여 필요한 프로젝트 팩터리를 구현하는 VSPackage를 찾습니다. IDE는 이 VSPackage를 로드합니다. SetSite 메서드에서 VSPackage는 RegisterProjectType 메서드를 호출하여 프로젝트 팩터리를 IDE에 등록해야 합니다.
IVsProjectFactory
인터페이스의 기본 메서드는 기존 프로젝트 열기 및 새 프로젝트 만들기라는 두 가지 시나리오를 처리해야 하는 CreateProject입니다. 대부분의 프로젝트는 프로젝트 상태를 프로젝트 파일에 저장합니다. 일반적으로 새 프로젝트는CreateProject
메서드에 전달된 템플릿 파일의 복사본을 만든 다음, 복사본을 열어서 만듭니다. 기존 프로젝트는CreateProject
메서드에 전달된 프로젝트 파일을 직접 열어서 인스턴스화합니다.CreateProject
메서드는 필요에 따라 사용자에게 추가 UI 기능을 표시할 수 있습니다.또한 프로젝트는 파일을 사용할 수 없으며 대신 데이터베이스 또는 웹 서버와 같은 파일 시스템 이외의 스토리지 메커니즘에 해당 프로젝트 상태를 저장할 수 있습니다. 이 경우
CreateProject
메서드에 전달된 파일 이름 매개 변수는 실제로 파일 시스템 경로가 아니라 프로젝트 데이터를 식별하는 고유한 문자열(URL)입니다. 실행할 적절한 생성 시퀀스를 트리거하기 위해CreateProject
에 전달되는 템플릿 파일을 복사할 필요가 없습니다.