今天早上意圖創建Device和SwapChain。這沒什么問題,但是我意圖通過模板演繹和宏來簡化對動態鏈接的DLL中函數的調用時,我寫的模板和宏不能正常工作。
我寫的函數和宏如下:
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
思路是通過函數的聲明演繹出函數類型,進行強轉然后調用。
失敗原因是盡管沒有直接調用pFunc,但pFunc依然作為參數被引用了,因為是動態鏈接的DLL,沒有引用對應的lib,所以鏈接時提示找不到符號的錯誤信息。
想知道有沒有什么其他的辦法只通過函數聲明而不通過引用來獲得類型以實現對動態鏈接的DLL中的函數的調用?vs2005還不支持typeof關鍵字,暫時沒有想到什么好辦法。
調用方代碼大致如下:以CreateDXGIFactory(Direct10里的一個函數) 舉例:
HRESULT ret = CallModuleFunc(m_hDXGIModule, CreateDXGIFactory, (__uuidof(IDXGIFactory), (void **)&pDXGIFactory) );
if (FAILED(ret))
{
ATLASSERT(0);
return E_FAIL;
}
后記:
在偉大的叛叛的指導下,用boost搞定了這個問題。
一個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);
}
}
按照這個思路已經可以寫出通用的宏了。
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的代碼我完全看不懂……學習C++的路漫漫其修遠兮……
posted on 2008-11-12 09:11
正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(429)
評論(1) 編輯 收藏 引用 所屬分類:
天地之靈