一个工程里不同模块里需要分别多次调用同一DLL的问题

ppc686 2009-11-22 08:46:08
这样的情况客户机该怎样写调用DLL的代码?是集中在某个地方写调用DLL的代码,还是每到一个模块里需要调用DLL的时候,再分别写调用代码?谢谢大家!
...全文
237 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allen_zhang 2009-11-24
  • 打赏
  • 举报
回复
动态加载也行啊,写成全局的就可以了
danielzhu 2009-11-23
  • 打赏
  • 举报
回复
直接静态编译算了,既然你有这么多地方调用的话。
WaistCoat14 2009-11-23
  • 打赏
  • 举报
回复
GetModuleHandle没有效率问题。
WaistCoat14 2009-11-23
  • 打赏
  • 举报
回复
同一个进程只需要加载一次,即LoadLibray,反复LoadLibray不会有问题,但要与FreeLibrary配对使用,两者数量要一致。

不建议反复LoadLibray/FreeLibrary,这样效率太低。
joey_ 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 waistcoat14 的回复:]
写一个动态加载的函数就可以了。

例如:

C/C++ codeBOOL CallDll()
{
HMODULE hDll= GetModuleHandle(_T("YourDll.dll"));if (!hDll)// 如果未加载 hDll= LoadLibrary("YourDll.dll");if (!hDll)return FALSE;

typedefvoid (*MYPROC)(LPTSTR);
MYPROC myProc= NULL
myProc= (MYPROC)GetProcAddress(hinstLib, _T("myProc"));if (myProc)
{
myProc(_T("test"));return TRUE;
}return FASLE;
}
[/Quote]

我也有疑问,想顺便请教一下,按你给出的方法做了,就是使用动态联编的方式已经取得了DLL库模块的一个句柄。

想确认一下,这个已经取得的DLL句柄能否在同一个工程里(就是客户EXE里)被第二次调用?


其次,原来取得的DLL库模块的那个句柄是否需要在第二次调用LoadLibray()之前释放掉?

如果这个已经存在的句柄在第二次调用LoadLibray()之前没有被释放掉,对这个客户程序EXE的调用是否会有什么影响?

谢谢大家~
zhileichen 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 p17939845 的回复:]
怎么用都行啊,MFC也都是DLL阿,你不是也到处都在用吗
[/Quote]
lz是在考虑效率问题。

通常多加载一个dll对效率影响不会很大。
  • 打赏
  • 举报
回复
静态加载
WaistCoat14 2009-11-22
  • 打赏
  • 举报
回复
写一个动态加载的函数就可以了。

例如:

BOOL CallDll()
{
HMODULE hDll = GetModuleHandle(_T("YourDll.dll"));
if (!hDll) // 如果未加载
hDll = LoadLibrary("YourDll.dll");
if (!hDll) return FALSE;

typedef void (*MYPROC)(LPTSTR);
MYPROC myProc = NULL
myProc = (MYPROC)GetProcAddress(hinstLib, _T("myProc"));
if (myProc)
{
myProc(_T("test"));
return TRUE;
}

return FASLE;
}
p17939845 2009-11-22
  • 打赏
  • 举报
回复
怎么用都行啊,MFC也都是DLL阿,你不是也到处都在用吗

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧