DXUT11框架淺析(3)--執行時(Run-Time)動態連結D3D的DLL
阿新 • • 發佈:2019-01-23
DXUT11框架淺析(3)—執行時(Run-Time)動態連結D3D的DLL
用depends開啟C:\Windows\System32\d3d9.dll檔案,可以看到:
我們知道動態庫(dll)的使用方式有兩種:一種是載入時動態連線(Load-TimeDynamic Linking),需要為專案配置這個dll的匯入庫(import library),然後在exe中可以像API那樣呼叫dll的匯出函式,dll在載入exe時就必須一同載入;另一種是執行時動態連線(Run-Time Dynamic Linking),無需匯入庫。而是當exe執行時在需要使用dll的地方用LoadLibrary載入dll,並用GetProcAddress獲取dll的匯出函式地址。
DXUT11框架只使用第二種方法,即執行時動態連線的方式呼叫d3d9.dll以及d3d11.dll、dxgi.dll。這樣做的好處之一是如果系統沒有安裝dx,載入程式時不會彈未找到…dll檔案提示框並崩潰,而是可以在程式啟動後再判斷是否有所需的dll,如果沒有,可以在程式中更友好的展示錯誤資訊,比如提示使用者安裝dx,提供dx執行時的下載地址等資訊。
1. 定義函式指標
// Module and function pointers staticHMODULE s_hModD3D9 = NULL; staticLPDIRECT3DCREATE9 s_DynamicDirect3DCreate9= NULL; staticLPD3DPERF_BEGINEVENT s_DynamicD3DPERF_BeginEvent= NULL; staticLPD3DPERF_ENDEVENT s_DynamicD3DPERF_EndEvent= NULL; staticLPD3DPERF_SETMARKER s_DynamicD3DPERF_SetMarker= NULL; staticLPD3DPERF_SETREGION s_DynamicD3DPERF_SetRegion= NULL; staticLPD3DPERF_QUERYREPEATFRAME s_DynamicD3DPERF_QueryRepeatFrame= NULL; staticLPD3DPERF_SETOPTIONS s_DynamicD3DPERF_SetOptions= NULL; staticLPD3DPERF_GETSTATUS s_DynamicD3DPERF_GetStatus= NULL; staticHMODULE s_hModDXGI=NULL; staticLPCREATEDXGIFACTORY s_DynamicCreateDXGIFactory= NULL; staticHMODULE s_hModD3D11 = NULL; static LPD3D11CREATEDEVICE s_DynamicD3D11CreateDevice=NULL;
2. 執行時動態連線dll
bool DXUT_EnsureD3D9APIs( void )
載入d3d9.dll,如果成功,則獲取各個API的地址。
bool DXUT_EnsureD3D11APIs( void )
載入d3d11.dll和dxgi.dll,如果成功,則獲取各個API的地址。
3. 呼叫dll的匯出函式
IDirect3D9 *WINAPIDXUT_Dynamic_Direct3DCreate9(UINTSDKVersion); int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent(D3DCOLORcol,LPCWSTRwszName); int WINAPI DXUT_Dynamic_D3DPERF_EndEvent(void ); voidWINAPIDXUT_Dynamic_D3DPERF_SetMarker(D3DCOLORcol,LPCWSTRwszName); voidWINAPIDXUT_Dynamic_D3DPERF_SetRegion(D3DCOLORcol,LPCWSTRwszName); BOOLWINAPIDXUT_Dynamic_D3DPERF_QueryRepeatFrame(void ); voidWINAPIDXUT_Dynamic_D3DPERF_SetOptions(DWORDdwOptions); DWORDWINAPIDXUT_Dynamic_D3DPERF_GetStatus(void ); HRESULTWINAPIDXUT_Dynamic_CreateDXGIFactory1(REFIIDrInterface,void**ppOut); HRESULTWINAPIDXUT_Dynamic_D3D11CreateDevice(IDXGIAdapter*pAdapter, D3D_DRIVER_TYPEDriverType, HMODULESoftware, UINT32Flags, D3D_FEATURE_LEVEL*pFeatureLevels, UINTFeatureLevels, UINT32SDKVersion, ID3D11Device**ppDevice, D3D_FEATURE_LEVEL*pFeatureLevel, ID3D11DeviceContext**ppImmediateContext);
這些API的功能後面遇到後再詳看。