天地之灵学习小组
我们学习小组的OpenGL学习笔记 大家一定要互相折磨呀~~
posts - 150,  comments - 156,  trackbacks - 0

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


FeedBack:
# re: 今天早上意图创建Device和SwapChain。 _ By Gardon
2008-11-12 10:43 | 陈梓瀚(vczh)
太FB了这个名字……

“正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷”  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(6)

随笔分类(149)

随笔档案(150)

同道中人

搜索

  •  

积分与排名

  • 积分 - 46147
  • 排名 - 475

最新随笔

最新评论

阅读排行榜

评论排行榜