다음을 통해 공유


프로젝트 팩터리를 사용하여 프로젝트 인스턴스 만들기

Visual Studio의 프로젝트 형식은 프로젝트 팩터 리를 사용하여 프로젝트 개체의 인스턴스를 만듭니다. 프로젝트 팩터리는 공동 생성 가능한 COM 개체에 대한 표준 클래스 팩터리와 유사합니다. 그러나 프로젝트 개체는 공동 생성할 수 없습니다. 프로젝트 팩터리를 사용해야만 만들 수 있습니다.

Visual Studio IDE는 사용자가 기존 프로젝트를 로드하거나 Visual Studio에서 새 프로젝트를 만들 때 VSPackage에서 구현된 프로젝트 팩터리를 호출합니다. 새 프로젝트 개체는 솔루션 탐색기를 채울 수 있는 충분한 정보를 IDE에 제공합니다. 또한 새 프로젝트 개체는 IDE에서 시작한 모든 관련 UI 작업을 지원하는 데 필요한 인터페이스를 제공합니다.

프로젝트의 클래스에서 인터페이스를 구현 IVsProjectFactory 할 수 있습니다. 일반적으로 자체 모듈에 상주합니다.

소유자가 집계할 수 있도록 지원하는 프로젝트는 프로젝트 파일에 소유자 키를 유지해야 합니다. CreateProject 소유자 키가 있는 프로젝트에서 메서드가 호출되면 소유된 프로젝트는 소유자 키를 프로젝트 팩터리 GUID로 변환한 다음, 이 프로젝트 팩터리의 메서드를 호출 CreateProject 하여 실제 생성을 수행합니다.

소유 프로젝트 만들기

소유자는 다음 두 단계로 소유된 프로젝트를 만듭니다.

  1. PreCreateForOwner 메서드를 호출합니다. 이렇게 하면 소유된 프로젝트에서 입력 제어를 기반으로 집계된 프로젝트 개체를 만들 수 있습니다 IUnknown. 소유된 프로젝트는 내부 IUnknown 개체와 집계된 개체를 소유자 프로젝트에 다시 전달합니다. 이렇게 하면 소유된 프로젝트에 내부 IUnknown를 저장할 수 있습니다.

  2. 메서드를 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에 등록해야 합니다.

    인터페이스IVsProjectFactoryCreateProject 기본 방법은 기존 프로젝트를 열고 새 프로젝트를 만드는 두 가지 시나리오를 처리해야 하는 것입니다. 대부분의 프로젝트는 프로젝트 파일에 프로젝트 상태를 저장합니다. 일반적으로 메서드에 전달된 CreateProject 템플릿 파일의 복사본을 만든 다음 복사본을 열어 새 프로젝트를 만듭니다. 기존 프로젝트는 메서드에 전달된 프로젝트 파일을 직접 열어 인스턴스화됩니다 CreateProject . 메서드는 CreateProject 필요에 따라 사용자에게 추가 UI 기능을 표시할 수 있습니다.

    또한 프로젝트는 파일을 사용하지 않고 대신 데이터베이스 또는 웹 서버와 같은 파일 시스템 이외의 스토리지 메커니즘에 프로젝트 상태를 저장할 수 있습니다. 이 경우 메서드에 CreateProject 전달된 파일 이름 매개 변수는 실제로 파일 시스템 경로가 아니라 프로젝트 데이터를 식별하는 고유한 문자열(URL)입니다. 실행할 적절한 생성 시퀀스를 트리거하기 위해 CreateProject 전달되는 템플릿 파일을 복사할 필요가 없습니다.