Udostępnij za pośrednictwem


Funkcje DLL

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

W tym temacie opisano sposób implementowania składnika jako biblioteki DLL (dynamic-link) w programie Microsoft DirectShow.

Biblioteka DLL musi zaimplementować następujące funkcje, aby można je było zarejestrować, wyrejestrować i załadować do pamięci.

  • DllMain: punkt wejścia biblioteki DLL. Nazwa DllMain jest symbolem zastępczym nazwy funkcji zdefiniowanej przez bibliotekę. Implementacja DirectShow używa nazwy DllEntryPoint. Aby uzyskać więcej informacji, zobacz zestaw SDK platformy.
  • DllGetClassObject: tworzy wystąpienie fabryki klas. Opisane w poprzednich sekcjach.
  • DllCanUnloadNow: wysyła zapytania o to, czy biblioteka DLL może zostać bezpiecznie zwolniona.
  • DllRegisterServer: tworzy wpisy rejestru dla biblioteki DLL.
  • DllUnregisterServer: usuwa wpisy rejestru dla biblioteki DLL.

Z nich pierwsze trzy są implementowane przez DirectShow. Jeśli szablon fabryki udostępnia funkcję inicjowania w zmiennej składowej m_lpfnInit, ta funkcja jest wywoływana z wewnątrz funkcji punktu wejścia biblioteki DLL. Aby uzyskać więcej informacji o tym, kiedy system wywołuje funkcję punktu wejścia biblioteki DLL, zobacz DllMain.

Należy zaimplementować DllRegisterServer i DllUnregisterServer, ale directShow udostępnia funkcję o nazwie AServerDllRegisterServer2, która wykonuje niezbędną pracę. Składnik może po prostu opakowować tę funkcję, jak pokazano w poniższym przykładzie:

STDAPI DllRegisterServer()
{
    return AMovieDllRegisterServer2( TRUE );
}

STDAPI DllUnregisterServer()
{
    return AMovieDllRegisterServer2( FALSE );
}

Jednak w dllRegisterServer i DllUnregisterServer można dostosować proces rejestracji zgodnie z potrzebami. Jeśli biblioteka DLL zawiera filtr, może być konieczne wykonanie dodatkowej pracy. Aby uzyskać więcej informacji, zobacz Jak zarejestrować filtry DirectShow.

W pliku definicji modułu (.def) wyeksportuj wszystkie funkcje DLL z wyjątkiem funkcji punktu wejścia. Poniżej przedstawiono przykładowy plik def:

EXPORTS
    DllGetClassObject PRIVATE
    DllCanUnloadNow PRIVATE
    DllRegisterServer PRIVATE
    DllUnregisterServer PRIVATE

Bibliotekę DLL można zarejestrować przy użyciu narzędzia Regsvr32.exe.

Jak utworzyć bibliotekę DLL filtru DirectShow