다음을 통해 공유


Visual Studio SDK의 이벤트 노출

Visual Studio에서는 자동화를 사용하여 이벤트를 제공할 수 있습니다. 프로젝트 및 프로젝트 항목에 대한 이벤트를 제공하는 것이 좋습니다.

이벤트는 Events 개체 또는 GetObject(예: GetObject("EventObjectName"))에서 자동화 소비자에 의해 검색됩니다. 환경은 DISPATCH_METHOD 또는 DISPATCH_PROPERTYGET 플래그를 통해 IDispatch::Invoke를 호출하여 이벤트를 반환합니다.

다음 프로세스에서는 VSPackage 관련 이벤트가 반환되는 방법을 설명합니다.

  1. 환경이 시작됩니다.

  2. 레지스트리에서 모든 VSPackage의 Automation, AutomationEventsAutomationProperties 키 아래에 있는 모든 값 이름을 읽고 해당 이름을 테이블에 저장합니다.

  3. 이 예시에서 자동화 소비자는 DTE.Events.AutomationProjectsEvents 또는 DTE.Events.AutomationProjectItemsEvents를 호출합니다.

  4. 환경은 테이블에서 문자열 매개 변수를 찾고 해당 VSPackage를 로드합니다.

  5. 환경은 호출에 전달된 이름을 사용하여 GetAutomationObject 메서드를 호출합니다. 이 예시에서는 AutomationProjectsEvents 또는 AutomationProjectItemsEvents입니다.

  6. VSPackage는 get_AutomationProjectsEvents, get_AutomationProjectItemEvents 등의 메서드가 있는 루트 개체를 만든 다음, 개체에 대한 IDispatch 포인터를 반환합니다.

  7. 환경은 자동화 호출에 대해 전달된 이름에 따라 적절한 메서드를 호출합니다.

  8. get_ 메서드는 IConnectionPointContainer 인터페이스와 IConnectionPoint 인터페이스를 모두 구현하고 개체에 IDispatchpointer를 반환하는 또 다른 IDispatch 기반 이벤트 개체를 만듭니다.

    자동화를 사용하여 이벤트를 노출하려면 GetAutomationObject에 응답하고 레지스트리에 추가하는 문자열을 감시해야 합니다. 기본 프로젝트 샘플에서 문자열은 BscProjectsEventsBscProjectItemsEvents입니다.

기본 프로젝트 샘플의 레지스트리 항목

이 섹션에서는 레지스트리에 자동화 이벤트 값을 추가할 위치를 보여 줍니다.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]

AutomationProjectEvents = Returns the AutomationProjectEvents object.

AutomationProjectItemEvents = Returns the AutomationProjectItemsEvents object.

속성 Type 범위 설명
기본값(@) REG_SZ 사용 안 함 사용되지 않습니다. 설명서에 데이터 필드를 사용할 수 있습니다.
AutomationProjectsEvents REG_SZ 이벤트 개체의 이름입니다. 키 이름만 관련이 있습니다. 설명서에 데이터 필드를 사용할 수 있습니다.

이 예시는 기본 프로젝트 샘플에서 제공됩니다.
AutomationProjectItemEvents REG_SZ 이벤트 개체의 이름입니다. 키 이름만 관련이 있습니다. 설명서에 데이터 필드를 사용할 수 있습니다.

이 예시는 기본 프로젝트 샘플에서 제공됩니다.

자동화 소비자가 이벤트 개체를 요청하는 경우 VSPackage에서 지원하는 이벤트에 대한 메서드가 있는 루트 개체를 만듭니다. 환경은 이 개체에서 적절한 get_ 메서드를 호출합니다. 예를 들어 DTE.Events.AutomationProjectsEvents가 호출되는 경우 루트 개체의 get_AutomationProjectsEvents 메서드가 호출됩니다.

Visual Studio 프로젝트 이벤트

이벤트에 대한 자동화 모델

CProjectEventsContainer 클래스는 BscProjectsEvents의 소스 개체를 나타내며 CProjectItemsEventsContainerBscProjectItemsEvents의 소스 개체를 나타냅니다.

대부분의 경우 대부분의 이벤트 개체가 필터 개체를 사용하므로 모든 이벤트 요청에 대해 새 개체를 반환해야 합니다. 이벤트를 발생시키는 경우 이 필터를 확인하여 이벤트 처리기가 호출되고 있는지 확인합니다.

AutomationEvents.hAutomationEvents.cpp에는 다음 표에 있는 클래스의 선언 및 구현이 포함되어 있습니다.

클래스 설명
CAutomationEvents DTE.Events 개체에서 검색되는 이벤트 루트 개체를 구현합니다.
CProjectsEventsContainerCProjectItemsEventsContainer 해당 이벤트를 발생시키는 이벤트 소스 개체를 구현합니다.

다음 코드 예시에서는 이벤트 개체에 대한 요청에 응답하는 방법을 보여 줍니다.

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)의 이름이고, g_wszAutomationProjectsEvents(FigProjectsEvents) 및 g_wszAutomationProjectItemsEvents(FigProjectItemEvents)는 VSPackage 구현에서 제공되는 프로젝트 이벤트 및 프로젝트 항목 이벤트의 이름입니다.

이벤트 개체는 동일한 중앙 위치인 DTE.Events 개체에서 검색됩니다. 이렇게 하면 모든 이벤트 개체가 그룹화되므로 최종 사용자가 특정 이벤트를 찾기 위해 전체 개체 모델을 찾아볼 필요가 없습니다. 또한 시스템 전체 이벤트에 대한 고유한 코드를 구현하지 않고도 특정 VSPackage 개체를 제공할 수 있습니다. 그러나 ProjectItem 인터페이스에 대한 이벤트를 찾아야 하는 최종 사용자의 경우 해당 이벤트 개체가 검색되는 위치에서 바로 파악되지는 않습니다.