DirectShow DirectShow 의 사용법 GraphEdit 에 의한 그래프 생성의 시뮬레이션 외부 프로세스로부터의 그래프의 로드   [목차열람] [주소복사] [슬롯비우기]
외부 프로세스로부터의 그래프의 로드
 
Microsoft DirectX 9.0

외부 프로세스로부터의 그래프의 로드

GraphEdit 는 외부 프로세스에 의해 생성 된 필터 그래프를 로드할 수 있다. 이 기능을 사용하면 애플리케이션 정원않고일까 코드를 추가하는 것만으로, 애플리케이션으로 생성 하는 필터 그래프를 정확하게 알 수 있다.

 :  이 기능은, Windows 2000 또는 Windows XP 를 필요로 한다.

애플리케이션으로 필터 그래프의 인스턴스를 실행중 개체 테이블 (ROT)에 등록해야 한다. ROT 는, 실행중 개체를 추적 관리하는 글로벌하게 액세스 가능한 룩 업 테이블이다. 개체는 모니카에 의해 ROT 에 등록된다. 그래프에 접속하기 위해서, GraphEdit 는 표시명이 특정의 포맷에 일치하는 모니카를 ROT 로 검색한다.

! FilterGraph X pid Y

여기서 X 는 필터 그래프 매니저의 16 진수 주소를 나타내,Y 는 16 진수의 프로세스 ID 를 나타낸다.

애플리케이션으로 최초로 필터 그래프를 생성 하려면 , 다음의 함수를 호출한다.

HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{
    IMoniker * pMoniker;
    IRunningObjectTable *pROT;
    if (FAILED(GetRunningObjectTable(0, &pROT))) {
        return E_FAIL;
    }
    WCHAR wsz[256];
    wsprintfW(wsz, 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 항목을 생성 한다. 최초의 파라미터는 필터 그래프의 포인터이다. 2 번째의 파라미터는, 새로운 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;
    
// 필터 그래프 매니저를 생성 한다.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **) &pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// 애플리케이션의 남은 부분 (생략).

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

GraphEdit 로 필터 그래프를 표시하려면 , 애플리케이션과 GraphEdit 를 동시에 실행한다. GraphEdit 로 [File] 메뉴의 [Connect] 를 클릭한다. [Connect To Graph] 다이알로그 박스로, 애플리케이션의 프로세스 id (pid)를 선택해,[OK] 를 클릭한다. GraphEdit 는 필터 그래프를 로드해, 표시한다. 예측할 수 없는 결과가 될 가능성이 있으므로, 이 그래프에서는 그 외의 GraphEdit 기능을 사용하지 않는 것. 예를 들어, 필터의 추가, 삭제, 또는 그래프의 정지, 시작은 실시하지 않는 것. GraphEdit 를 종료하고 나서, 애플리케이션을 종료한다.

:  애플리케이션에서는, 종료시에 다양한 에러가 발생하는 일이 있다. 이것들은 무시할 수 있다.

다음의 그림에 [Connect To Graph] 다이알로그 박스를 나타낸다.

[Connect To Graph] 다이얼로그 박스

GraphEdit 가 그래프를 로드할 때, 그래프는 타겟 애플리케이션의 문맥으로 실행된다. 따라서, GraphEdit 는 thread가 출현할 때까지 대기하기 위해(때문에), 동작을 정지하는 일이 있다. 예를 들어, 디버거로 코드를 스텝 실행할 경우에 이 동작이 발생하는 일이 있다.

이 기능을 사용하면 다른 애플리케이션으로부터 필터 그래프의 표시나 제어를 할 수 있게 되기 (위해)때문에, 애플리케이션의 리테일 빌드는 아니고, 디버그 빌드에서만 사용하는 것.

커멘드 라인으로부터 리모트 그래프에의 접속

GraphEdit 에서는, 기동시에 리모트 그래프를 자동적으로 로드하는 커멘드 라인 옵션을 지원 하고 있다. 다음에 구문을 나타낸다.

GraphEdt -a moniker

여기서,moniker 는 전에 설명한 AddToRot 함수를 사용해 생성 되는 모니카를 나타낸다.

↑TOP