다음을 통해 공유


외부 프로세스에서 그래프 로드

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

GraphEdit는 외부 프로세스에서 만든 필터 그래프를 로드할 수 있습니다. 이 기능을 사용하면 애플리케이션에서 최소한의 추가 코드만 사용하여 애플리케이션이 빌드하는 필터 그래프를 정확하게 확인할 수 있습니다.

참고

이 기능을 사용하려면 Windows 2000, Windows XP 이상이 필요합니다.

 

참고

Windows Vista부터 이 기능을 사용하려면 proppage.dll 등록해야 합니다. Proppage.dll Windows SDK에 포함되어 있습니다.

 

애플리케이션은 ROT(실행 중인 개체 테이블)에 instance 필터 그래프를 등록해야 합니다. ROT는 실행 중인 개체를 추적하는 전역적으로 액세스할 수 있는 조회 테이블입니다. 개체는 모니커에 의해 ROT에 등록됩니다. 그래프에 연결하기 위해 GraphEdit는 ROT에서 표시 이름이 특정 형식과 일치하는 모니커를 검색합니다.

!FilterGraph X pid Y

여기서 X 는 필터 그래프 관리자의 16진수 주소이고 Y 는 16진수의 프로세스 ID입니다.

애플리케이션이 필터 그래프를 처음 만들 때 다음 함수를 호출합니다.

HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{
    IMoniker * pMoniker = NULL;
    IRunningObjectTable *pROT = NULL;

    if (FAILED(GetRunningObjectTable(0, &pROT))) 
    {
        return E_FAIL;
    }
    
    const size_t STRING_LENGTH = 256;

    WCHAR wsz[STRING_LENGTH];
 
   StringCchPrintfW(
        wsz, STRING_LENGTH, 
        L"FilterGraph %08x pid %08x", 
        (DWORD_PTR)pUnkGraph, 
        GetCurrentProcessId()
        );
    
    HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
    if (SUCCEEDED(hr)) 
    {
        hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, pUnkGraph,
            pMoniker, pdwRegister);
        pMoniker->Release();
    }
    pROT->Release();
    
    return hr;
}

이 함수는 필터 그래프에 대한 모니커와 새 ROT 항목을 만듭니다. 첫 번째 매개 변수는 필터 그래프에 대한 포인터입니다. 두 번째 매개 변수는 새 ROT 항목을 식별하는 값을 받습니다. 애플리케이션이 필터 그래프를 해제하기 전에 다음 함수를 호출하여 ROT 항목을 제거합니다. pdwRegister 매개 변수는 AddToRot 함수에서 반환된 식별자입니다.

void RemoveFromRot(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;
    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

다음 코드 예제에서는 이러한 함수를 호출하는 방법을 보여 줍니다. 이 예제에서는 ROT 항목을 추가하고 제거하는 코드가 조건부로 컴파일되므로 디버그 빌드에만 포함됩니다.

IGraphBuilder *pGraph;
DWORD dwRegister;
    
// Create the filter graph manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// Rest of the application (not shown).

#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

GraphEdit에서 필터 그래프를 보려면 애플리케이션 및 GraphEdit를 동시에 실행합니다. GraphEdit 파일 메뉴에서 원격 그래프에 연결...을 클릭합니다. 그래프에 연결 대화 상자에서 애플리케이션의 프로세스 ID(pid)를 선택하고 확인을 클릭합니다. GraphEdit는 필터 그래프를 로드하고 표시합니다. 이 그래프에 다른 GraphEdit 기능을 사용하지 마세요. 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 필터를 추가하거나 제거하거나 그래프를 중지하고 시작하지 마세요. 애플리케이션을 종료하기 전에 GraphEdit를 닫습니다.

참고

애플리케이션이 종료될 때 다양한 어설션에 도달할 수 있습니다. 무시할 수 있습니다.

 

다음 그림에서는 그래프에 연결 대화 상자를 보여 줍니다.

그래프에 연결

GraphEdit에서 그래프를 로드하면 대상 애플리케이션의 컨텍스트에서 실행됩니다. 따라서 GraphEdit는 스레드를 기다리고 있기 때문에 차단할 수 있습니다. 예를 들어 디버거에서 코드를 단계별로 실행하는 경우 이 문제가 발생할 수 있습니다.

이 기능은 다른 애플리케이션에서 필터 그래프를 보거나 제어할 수 있으므로 소매 빌드가 아닌 애플리케이션의 디버그 빌드에서만 사용해야 합니다.

명령줄에서 원격 그래프에 연결

GraphEdit는 시작 시 원격 그래프를 자동으로 로드하는 명령줄 옵션을 지원합니다. 구문은 다음과 같습니다.

GraphEdt -a moniker

여기서 모니커는 앞에서 설명한 AddToRot 함수를 사용하여 만든 모니커입니다.

GraphEdit를 사용하여 그래프 빌드 시뮬레이션