프로젝트 개체를 노출합니다.
Visual Studio여기서 VSPackages Visual Studio 자동화 모델에 영향을 완벽 하 게 확장 될 수 있습니다 있는 동적 환경을 제공 합니다. 이러한 새 개체는 자동화 모델 확장 DTE 개체입니다.
DTE 개체는 Visual Studio 자동화 모델의 주 개체입니다. 맨 위에 있습니다.이 Visual Studio 자동화 개체 계층 구조입니다.
VSPackage 특정 개체 이름이 있는 레지스트리에 저장 됩니다 및 VSPackage 구현 부분을 만들어 개체를 반환 하는 코드입니다. 어떻게 VSPackage 특정 개체를 찾을 수 있습니다 다음 프로세스를 설명 합니다.
Visual Studio Develpment ide의 시작을 통합 합니다.
모든 Vspackages의 자동화, AutomationEvents 및 AutomationProperties 키에서 모든 값 이름을 레지스트리에서 읽고이 이름에는 테이블에 저장 합니다.
자동화 소비자를 호출 하 여 GetObject 메서드 또는 IDispatch::GetIDsOfNames, 아래와 같은 개체의 이름을 전달 하 고:
DTE.GetObject("VCProjects")
IDE 테이블에 문자열 매개 변수를 찾고 해당 VSPackage 로드 합니다.
IDE 호출을 GetAutomationObject "VCProjects" 호출에 전달 된 것과 같은 이름을 사용 하 여 메서드.
Vspackage를 생성 하 고 반환의 IDispatch 개체의 포인터입니다. 해당 개체가 이미 있는 경우 해당 참조 횟수를 증가 합니다. 이 예에서는 호출자에 게 포인터 표준으로 다시 전달 됩니다 Projects 컬렉션 개체를 Visual c + +에서 구현 되는 것입니다.
반환 되는 개체의 자동화 개체는 프로젝트의 나머지 부분을 찾고입니다.
특정 구한 후 Projects 개체을 사용 하는 Item 얻으려면 메서드는 Project Visual c + + 프로젝트에 해당 개체. 표준 구한 후 Project 개체을 호출 하는 Object 프로젝트 관련 개체를 가져올 개체입니다. Object 개체는 확장 개체를 반환의 Project 고유한 메서드 및 속성을 사용 하 여 개체입니다. 경우에 생성 하 다른 개체를 반환할 수 있습니다.
노출 하려는 자동화 개체의 이름은 문자열 값이 다음 레지스트리 키의 이름을 다른 이름으로 저장 됩니다.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\ <PkgGUID> \Automation]
참고
<PkgGUID> 텍스트 실제 GUID를 VSPackage 나타냅니다.
다음 코드 예제와 표에서 일반적인 레지스트리 항목을 포함합니다.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\ <PkgGUID> \Automation]
@=""
"수치 프로젝트 자동화 개체 FigProjects"=""
Name |
형식 |
범위 |
설명 |
---|---|---|---|
기본 (@) |
REG_SZ |
null |
사용되지 않습니다. 이 설명서를 사용할 수 있습니다. |
FigProjects |
REG_SZ |
고유한 프로젝트 컬렉션 개체의 이름입니다. |
키 이름에만 관련이 있습니다. 설명서에 대 한 데이터 필드를 사용할 수 있습니다. |
새 프로젝트 형식에서 제공 하는 모든 VSPackages 자동화 개체를 제공 합니다. 예를 들어, Visual C++ VSPackage 관련 된 추가 기능을 통해 다음 호출할 수 있는 개체를 만듭니다 DTE.VCProjects 또는 DTE.GetObject("프로젝트 개체를 가져오려면 VCProjects") Visual C++ 통해에서 Projects 컬렉션입니다. Projects 및 그에 포함 된 Project 항목의 Visual C++ 구현 하지만 표준 패턴에 따라. 그러나 소비자를 얻을 수 있습니다 Project.Object, 어떤 프로젝트 형식에 대해 고유 하며도 자신의 고유한 개체를 제공할 수 있습니다. 프로젝트 자동화 모델도 있을 수 있습니다 Project.CodeModel가 수 수 쿼리 (VCCodeModel)는 가장 많이 파생 개체에 대 한.
마찬가지 ProjectItem, 어떤 또한 서피스 ProjectItem.Object, a FileCodeModel.
Visual C++ VSPackage 다음 자동화 소비자에 다시 전달 하는 개체를 만듭니다.
프로젝트에 대 한 특정 VSPackage 개체를 참가할 수
적절 한 키를 VSPackage 레지스트리 설정에 추가 합니다.
코드에 구현는 GetAutomationObject 의 IVsPackage 를 반환 하는 인터페이스는 IDispatch 개체입니다.
다음 코드 예제에서는 GetAutomationObject 메서드를 구현하는 방법을 보여 줍니다.
Private Function GetAutomationObject(ByVal pszPropName As LPCOLESTR, ByVal ppIDispatch As IDispatch**) As STDMETHODIMP Implements CVsPackage.GetAutomationObject ExpectedPtrRet(ppIDispatch) *ppIDispatch = NULL If _wcsicmp(pszPropName, g_wszAutomationProjects) = 0 Then 'Is the requested name our Projects object? ' Gets our Projects object Return GetAutomationProjects(ppIDispatch) ElseIf _wcsicmp(pszPropName, g_wszAutomationProjectsEvents) = 0 Then 'Is the requested name our ProjectsEvents object? ' Gets our ProjectEvents object Return CAutomationEvents.GetAutomationEvents(ppIDispatch) ElseIf _wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) = 0 Then 'Is the requested name our ProjectsItemsEvents object? ' Gets our ProjectItemsEvents object Return CAutomationEvents.GetAutomationEvents(ppIDispatch) End If Return E_INVALIDARG End Function
STDMETHODIMP CVsPackage::GetAutomationObject( /* [in] */ LPCOLESTR pszPropName, /* [out] */ IDispatch ** ppIDispatch) { ExpectedPtrRet(ppIDispatch); *ppIDispatch = NULL; if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0) //Is the requested name our Projects object? { return GetAutomationProjects(ppIDispatch); // Gets our Projects object } else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0) //Is the requested name our ProjectsEvents object? { return CAutomationEvents::GetAutomationEvents(ppIDispatch); // Gets our ProjectEvents object } else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0) //Is the requested name our ProjectsItemsEvents object? { return CAutomationEvents::GetAutomationEvents(ppIDispatch); // Gets our ProjectItemsEvents object } return E_INVALIDARG; }
코드에서 g_wszAutomationProjects , 프로젝트 컬렉션의 이름입니다. 이 예제에서는이 "FigProjects", <PkgGUID> \Automation 키 (레지스트리 항목에 표시 됨)에서 등록 된 문자열입니다. GetAutomationProjects 메서드를 구현 하는 개체를 만듭니다의 Projects 인터페이스 및 반환에 IDispatch 다음 코드 예제에서와 같이 호출 하는 개체에 대 한 포인터입니다.
Private Function GetAutomationProjects(ByVal ppIDispatch As IDispatch**) As HRESULT Implements CVsPackage.GetAutomationProjects ExpectedPtrRet(ppIDispatch) *ppIDispatch = NULL If Not m_srpAutomationProjects Then Dim hr As HRESULT = CACProjects.CreateInstance(AddressOf m_srpAutomationProjects) IfFailRet(hr) ExpectedExprRet(m_srpAutomationProjects <> NULL) End If Return m_srpAutomationProjects.CopyTo(ppIDispatch) End Function
HRESULT CVsPackage::GetAutomationProjects(/* [out] */ IDispatch ** ppIDispatch) { ExpectedPtrRet(ppIDispatch); *ppIDispatch = NULL; if (!m_srpAutomationProjects) { HRESULT hr = CACProjects::CreateInstance(&m_srpAutomationProjects); IfFailRet(hr); ExpectedExprRet(m_srpAutomationProjects != NULL); } return m_srpAutomationProjects.CopyTo(ppIDispatch); }
자동화 개체에 대해 고유한 이름을 선택 해야 합니다. 이름 충돌 예측할 수 없고 여러 Vspackages에 동일한 이름을 사용 하는 경우에 임의로 합니다 충돌 하는 개체 이름 충돌로 발생할 합니다. 이러한 충돌이 발생 하지 않도록 하려면 회사 이름 또는 제품 이름 자동화 개체의 이름에 고유한 측면이 포함 하는 것이 좋습니다.
Projects 컬렉션 개체는 프로젝트 자동화 모델의 나머지 부분에 대 한 진입점입니다. 소비자에 게 제공 하는 적절 한 코드 및 레지스트리 항목을 만든 후 Projects 개체 컬렉션을 나머지 프로젝트 모델에 대 한 표준 개체 구현을 제공 해야 합니다. 자세한 내용은 프로젝트 모델링를 참조하십시오.