在 DLL 中哪里调用 LoadLibrary?

Posted

技术标签:

【中文标题】在 DLL 中哪里调用 LoadLibrary?【英文标题】:Where to call LoadLibrary in a DLL? 【发布时间】:2012-11-03 01:26:02 【问题描述】:

我正在制作一个使用 LoadLibrary 动态加载另一个 DLL (winsock) 的 DLL。我读到我不应该在 DllMain 中调用 LoadLibrary,但是我反复使用它,并且不想每次使用时都调用 LoadLibrary/GetProcAddress。所以我的问题是:

在 DLL 中调用 LoadLibrary 的最佳位置在哪里?

LoadLibrary/GetProcAddress 有多快?在每个函数中这样做会不会有很多开销?

【问题讨论】:

【参考方案1】:

创建一个在 DllMain 之外进行设置的初始化函数。您的代码在加载 DLL 后调用该函数,然后该函数可以调用完成初始化所需的任何内容。

调用 LoadLibrary() 应该只执行一次。这是昂贵的,因为操作系统必须确保在继续之前加载所有依赖项,并在进程中保留空间。如果 DLL 已经加载,这比从磁盘加载要快得多。

GetProcAddress() 实际上也应该每个函数只调用一次(理想情况下)。该函数必须遍历 DLL 的导出表并按名称定位函数。这涉及到字符串比较来定位地址。您想缓存地址以供以后使用,以便下次直接调用它。

【讨论】:

以上是关于在 DLL 中哪里调用 LoadLibrary?的主要内容,如果未能解决你的问题,请参考以下文章

关于C++加载DLL文件 用的LoadLibrary方法的问题

使用 P/Invoke 调用 dll 时,为啥 LoadLibrary 在某些机器上会失败?

vc++ loadlibrary dll路径问题

使用 loadLibrary() 在 java 中调用 c++ dll

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

从DllMain调用LoadLibrary