今天早上意圖創(chuàng)建Device和SwapChain。這沒什么問題,但是我意圖通過模板演繹和宏來簡(jiǎn)化對(duì)動(dòng)態(tài)鏈接的DLL中函數(shù)的調(diào)用時(shí),我寫的模板和宏不能正常工作。
我寫的函數(shù)和宏如下:
template <typename FuncType>
FuncType __forceinline GetModuleFunc(HMODULE hModule, LPCSTR lpProcName, FuncType /*pFunc*/)
{
return reinterpret_cast<FuncType>(GetProcAddress(hModule, lpProcName));
}
#define CallModuleFunc(Module, ProcName, Args) (GetModuleFunc(Module, #ProcName, ProcName))?((GetModuleFunc(Module, #ProcName, ProcName)) Args) : E_FAIL
思路是通過函數(shù)的聲明演繹出函數(shù)類型,進(jìn)行強(qiáng)轉(zhuǎn)然后調(diào)用。
失敗原因是盡管沒有直接調(diào)用pFunc,但pFunc依然作為參數(shù)被引用了,因?yàn)槭莿?dòng)態(tài)鏈接的DLL,沒有引用對(duì)應(yīng)的lib,所以鏈接時(shí)提示找不到符號(hào)的錯(cuò)誤信息。
想知道有沒有什么其他的辦法只通過函數(shù)聲明而不通過引用來獲得類型以實(shí)現(xiàn)對(duì)動(dòng)態(tài)鏈接的DLL中的函數(shù)的調(diào)用?vs2005還不支持typeof關(guān)鍵字,暫時(shí)沒有想到什么好辦法。
調(diào)用方代碼大致如下:以CreateDXGIFactory(Direct10里的一個(gè)函數(shù)) 舉例:
HRESULT ret = CallModuleFunc(m_hDXGIModule, CreateDXGIFactory, (__uuidof(IDXGIFactory), (void **)&pDXGIFactory) );
if (FAILED(ret))
{
ATLASSERT(0);
return E_FAIL;
}
后記:
在偉大的叛叛的指導(dǎo)下,用boost搞定了這個(gè)問題。
一個(gè)test程序如下:
BOOST_TYPEOF(Direct3DCreate9) *pDirect3DCreate9 = NULL;
HMODULE hdx = LoadLibrary(_T("d3d9.dll"));
pDirect3DCreate9 = reinterpret_cast<BOOST_TYPEOF(Direct3DCreate9) *>(GetProcAddress(hdx, "Direct3DCreate9"));
if (pDirect3DCreate9 == NULL)
{
ATLASSERT(0);
}
else
{
IDirect3D9 * pD3D = pDirect3DCreate9(D3D_SDK_VERSION);
if (pD3D == NULL)
{
ATLASSERT(0);
}
}
按照這個(gè)思路已經(jīng)可以寫出通用的宏了。
template <typename FuncType>
FuncType __forceinline GetModuleFunc(HMODULE hModule, LPCSTR lpProcName)
{
FuncType fun = reinterpret_cast<FuncType>(GetProcAddress(hModule, lpProcName));
return fun;
}
#define CallModuleFunc(Module, ProcName, Args) (GetModuleFunc<BOOST_TYPEOF(ProcName) *>(Module, #ProcName))?((GetModuleFunc<BOOST_TYPEOF(ProcName) *>(Module, #ProcName)) Args) : E_FAIL
可惜的是boost::typeof的代碼我完全看不懂……學(xué)習(xí)C++的路漫漫其修遠(yuǎn)兮……