在DLL中调用LoadLibrary的位置?

时间:2012-11-03 01:26:02

标签: c++ c windows dll

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

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

  • LoadLibrary / GetProcAddress的速度有多快?在每个函数中这样做有很多开销吗?

1 个答案:

答案 0 :(得分:3)

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

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

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