1. 程式人生 > >DXUT11框架淺析(3)--執行時(Run-Time)動態連結D3D的DLL

DXUT11框架淺析(3)--執行時(Run-Time)動態連結D3D的DLL

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的功能後面遇到後再詳看。

參考資料