次の方法で共有


ファクトリ テンプレート配列

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

ファクトリ テンプレートには、次のパブリック メンバー変数が含まれています。

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)

m_lpfnNewとm_lpfnInitの 2 つの関数ポインターでは、次の型定義を使用します。

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

1 つ目は、コンポーネントのインスタンス化関数です。 2 つ目は、省略可能な初期化関数です。 初期化関数を指定すると、DLL エントリ ポイント関数内から呼び出されます。 (DLL エントリ ポイント関数については、この記事の後半で説明します)。

CUnknown から継承する CMyComponent という名前のコンポーネントを含む DLL を作成しているとします。 DLL には、次の項目を指定する必要があります。

  • 初期化関数。CMyComponent の新しいインスタンスを返すパブリック メソッドです。
  • g_Templatesという名前のファクトリ テンプレートのグローバル配列 この配列には、CMyComponent のファクトリ テンプレートが含まれています。
  • 配列のサイズ を指定する g_cTemplates という名前のグローバル変数。

次の例は、これらの項目を宣言する方法を示しています。

// 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]);    

メソッドは CreateInstance クラス コンストラクターを呼び出し、新しいクラス インスタンスへのポインターを返します。 パラメーター pUnk は、集計 IUnknown へのポインターです。 このパラメーターをクラス コンストラクターに渡すことができます。 パラメーター pHr は、HRESULT 値へのポインターです。 クラス コンストラクターはこれを適切な値に設定しますが、コンストラクターが失敗した場合は、値を E_OUTOFMEMORY に設定します。

NAME マクロはデバッグ ビルドで文字列を生成しますが、製品版ビルドでは NULL に解決されます。 この例では、デバッグ ログに表示されますが、最終バージョンではメモリを占有しない名前をコンポーネントに付けるために使用します。

クラス ファクトリは CreateInstance ファクトリ テンプレート内の関数ポインターを参照するため、メソッドには任意の名前を付けることができます。 ただし、 g_Templatesg_cTemplates は、クラス ファクトリが見つけることを期待するグローバル変数であるため、これらの名前を正確に持っている必要があります。

DirectShow フィルター DLL を作成する方法