Bagikan melalui


Memuat Grafik Dari Proses Eksternal

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

GraphEdit dapat memuat grafik filter yang dibuat oleh proses eksternal. Dengan fitur ini, Anda dapat melihat dengan tepat grafik filter apa yang dibangun aplikasi Anda, hanya dengan jumlah kode tambahan minimal dalam aplikasi Anda.

Catatan

Fitur ini memerlukan Windows 2000, Windows XP, atau yang lebih baru.

 

Catatan

Mulai dari Windows Vista, Anda harus mendaftarkan proppage.dll untuk mengaktifkan fitur ini. Proppage.dll disertakan dalam Windows SDK.

 

Aplikasi harus mendaftarkan instans grafik filter di Running Object Table (ROT). ROT adalah tabel pencarian yang dapat diakses secara global yang melacak objek yang berjalan. Objek terdaftar di ROT oleh moniker. Untuk menyambungkan ke grafik, GraphEdit mencari moniker ROT yang nama tampilannya cocok dengan format tertentu:

!FilterGraph X pid Y

di mana X adalah alamat heksadesimal dari Filter Graph Manager, dan Y adalah id proses, juga dalam heksadesimal.

Saat aplikasi Anda pertama kali membuat grafik filter, panggil fungsi berikut:

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;
}

Fungsi ini membuat moniker dan entri ROT baru untuk grafik filter. Parameter pertama adalah penunjuk ke grafik filter. Parameter kedua menerima nilai yang mengidentifikasi entri ROT baru. Sebelum aplikasi merilis grafik filter, panggil fungsi berikut untuk menghapus entri ROT. Parameter pdwRegister adalah pengidentifikasi yang dikembalikan oleh fungsi AddToRot.

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

Contoh kode berikut menunjukkan cara memanggil fungsi-fungsi ini. Dalam contoh ini, kode yang menambahkan dan menghapus entri ROT dikompilasi secara kondisional, sehingga hanya disertakan dalam build debug.

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();

Untuk melihat grafik filter di GraphEdit, jalankan aplikasi Anda dan GraphEdit secara bersamaan. Di menu GraphEdit File , klik Sambungkan ke Grafik Jarak Jauh... Dalam kotak dialog Sambungkan Ke Grafik , pilih id proses (pid) aplikasi Anda dan klik OK. GraphEdit memuat grafik filter dan menampilkannya. Jangan gunakan fitur GraphEdit lainnya pada grafik iniā€”ini dapat menyebabkan hasil yang tidak terduga. Misalnya, jangan menambahkan atau menghapus filter, atau menghentikan dan memulai grafik. Tutup GraphEdit sebelum keluar dari aplikasi Anda.

Catatan

Aplikasi Anda mungkin mencapai berbagai pernyataan saat keluar. Anda dapat mengabaikan ini.

 

Ilustrasi berikut ini memperlihatkan kotak dialog Sambungkan Ke Grafik .

menyambungkan ke grafik

Saat GraphEdit memuat grafik, grafik dijalankan dalam konteks aplikasi target. Oleh karena itu, GraphEdit mungkin memblokir karena sedang menunggu utas. Misalnya, ini dapat terjadi jika Anda melangkah melalui kode Anda di debugger.

Fitur ini harus digunakan hanya dalam build debug aplikasi Anda, bukan build ritel, karena memungkinkan aplikasi lain untuk melihat atau mengontrol grafik filter.

Menyambungkan ke Grafik Jarak Jauh dari Baris Perintah

GraphEdit mendukung opsi baris perintah untuk memuat grafik jarak jauh secara otomatis saat startup. Sintaksnya adalah:

GraphEdt -a moniker

di mana moniker adalah moniker yang dibuat menggunakan fungsi AddToRot, yang dijelaskan sebelumnya.

Mensimulasikan Pembuatan Grafik dengan GraphSedit