Bagikan melalui


Array Templat Pabrik

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan 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 Pengambilan Audio/Video 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.]

Templat pabrik berisi variabel anggota publik berikut:

const WCHAR *              m_Name;                // Name
const CLSID *              m_ClsID;               // CLSID
LPFNNewCOMObject           m_lpfnNew;             // Function to create an instance
                                                  //   of the component
LPFNInitRoutine            m_lpfnInit;            // Initialization function (optional)
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; // Set-up information (for filters)

Dua penunjuk fungsi, m_lpfnNew dan m_lpfnInit, gunakan definisi jenis berikut:

typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);

Yang pertama adalah fungsi instansiasi untuk komponen. Yang kedua adalah fungsi inisialisasi opsional. Jika Anda menyediakan fungsi inisialisasi, fungsi ini dipanggil dari dalam fungsi titik masuk DLL. (Fungsi titik masuk DLL dibahas nanti di artikel ini.)

Misalkan Anda membuat DLL yang berisi komponen bernama CMyComponent, yang mewarisi dari CUnknown. Anda harus menyediakan item berikut di DLL Anda:

  • Fungsi inisialisasi, metode publik yang mengembalikan instans baru CMyComponent.
  • Array global templat pabrik, bernama g_Templates. Array ini berisi templat pabrik untuk CMyComponent.
  • Variabel global bernama g_cTemplates yang menentukan ukuran array.

Contoh berikut menunjukkan cara mendeklarasikan item-item ini:

// Public method that returns a new instance. 
CUnknown * WINAPI CMyComponent::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 
{
    CMyComponent *pNewObject = new CMyComponent(NAME("My Component"), pUnk, pHr );
    if (pNewObject == NULL) {
        *pHr = E_OUTOFMEMORY;
    }
    return pNewObject;
} 

CFactoryTemplate g_Templates[1] = 
{
    { 
      L"My Component",                // Name
      &CLSID_MyComponent,             // CLSID
      CMyComponent::CreateInstance,   // Method to create an instance of MyComponent
      NULL,                           // Initialization function
      NULL                            // Set-up information (for filters)
    }
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);    

Metode CreateInstance memanggil konstruktor kelas dan mengembalikan pointer ke instans kelas baru. Parameter pUnk adalah penunjuk keIUnknownyang menggabungkan . Anda cukup meneruskan parameter ini ke konstruktor kelas. Parameter pHr adalah penunjuk ke nilai HRESULT. Konstruktor kelas mengatur ini ke nilai yang sesuai, tetapi jika konstruktor gagal, atur nilai ke E_OUTOFMEMORY.

MakroNAMAmenghasilkan string dalam build debug tetapi diselesaikan untuk NULL dalam build ritel. Ini digunakan dalam contoh ini untuk memberi komponen nama yang muncul di log debug tetapi tidak menempati memori di versi akhir.

Metode CreateInstance dapat memiliki nama apa pun, karena pabrik kelas mengacu pada penunjuk fungsi di templat pabrik. Namun, g_Templates dan g_cTemplates adalah variabel global yang diharapkan pabrik kelas untuk menemukan, sehingga mereka harus memiliki nama-nama tersebut.

Cara Membuat DLL Filter DirectShow