11月12日_今天早上意图创建Device和SwapChain。_By Gardon

11月12日_今天早上意图创建Device和SwapChain。_By Gardon

今天早上意图创建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++的路漫漫其修远兮……

你可能感兴趣的:(11月12日_今天早上意图创建Device和SwapChain。_By Gardon)