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가 새 프로젝트를 만들어야 하는지 아니면 특정 유형의 기존 프로젝트를 열어야 하는지 결정하자마자 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전달되는 템플릿 파일을 복사할 필요가 없습니다.