2008年6月15日 星期日

DMO, ATL & DisableThreadLibraryCalls

在觀摩AMD 的 BSP for mpeg2 decoder的時候




AMD使用DMO (DirectX Media Object)


而這個DMO又使用了ATL




以下為 sample code




CComModule _Module;
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;




}




其中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),因為這個類別 (通常是 CComObjectCComAggObjectCComPolyObject) 會為專案初始化 vtable 指標。
您無法從任何使用 declspec(novtable) 物件之建構函式呼叫 Virtual 函式。您必須將這些呼叫移至 FinalConstruct 方法。




沒有留言: