在觀摩AMD 的 BSP for mpeg2 decoder的時候
AMD使用DMO (DirectX Media Object)
而這個DMO又使用了ATL
以下為 sample code
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap)
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_AMDMPVDMO, CAmdMpvDmo)
END_OBJECT_MAP()
/////////////////////////////////////////////////////////////////////////////
// DLL Entry Point
extern "C"
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, reinterpret_cast(hDllHandle)); DisableThreadLibraryCalls(reinterpret_cast(hDllHandle));
} else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE;
return TRUE;
}
其中DisableThreadLibraryCalls 就是用來 disable DLL_THREAD_ATTACH 和
DLL_THREAD_DETACH 的 notification
(如果這個DLL會link to static C run time library, 就不能使用 DisableThreadLibraryCalls
因為The static CRT requires DLL_THREAD_ATTACH and DLL_THREAD_DETATCH notifications to function properly. )
關於ATL
什麼是ATL 呢? 它用來做什麼的?
ATL is the Active Template Library, a set of template-based C++ classes with which you can easily create small, fast Component Object Model (COM) objects.
DMO, DMO 也是COM
DirectX Media Objects (DMOs) are COM-based multimedia and data-streaming components.
DMO 的 sample implementation
在 WINCE500\PUBLIC\DIRECTX\SDK\INC\dmobase.h
ATL_NO_VTABLE,
ATL_NO_VTABLE 巨集會展開為__declspec(novtable).
在基類中初始化虛函數表是沒有用的,因為它會被派生類覆蓋掉,所以我們可以對它使用ATL_NO_VTABLE, 免得它產生虛函數表
當您建置專案時,連結器 (Linker) 會排除 vtable 指向的 vtable 和所有函式。
您必須只在不是直接可建的基底函式上使用 ATL_NO_VTABLE 並接著使用 declspec(novtable)。您無法在專案中衍生程度最高的類別上使用 declspec(novtable),因為這個類別 (通常是 CComObject、CComAggObject 或 CComPolyObject) 會為專案初始化 vtable 指標。
您無法從任何使用 declspec(novtable) 物件之建構函式呼叫 Virtual 函式。您必須將這些呼叫移至 FinalConstruct 方法。
沒有留言:
張貼留言