c - LoadLibrary 调用,返回的指针未保存

标签 c optimization dll loadlibrary

我正在修复其他人的代码并注意到该人多次调用 LoadLibrary,如下所示:

LoadLibrary("C:\\Windows\\SysWOW64\\msjint40");
LoadLibrary("C:\\Windows\\SysWOW64\\msjtes40");
LoadLibrary("C:\\Windows\\SysWOW64\\expsrv");

这有什么意义呢?返回指针未保存!该程序稍后会调用一堆其他 DLL,这些 DLL 使用 MSJTES40 中的函数,但不在加载库的上下文中。

评论说 - “else preload to optimize”,但程序的其余部分如何知道 DLL 的位置?

感谢您提供任何信息。

最佳答案

LoadLibrary 将指定的模块带入地址空间。库不能加载两次,所以这样做会导致预加载(加载的模块可能有其他依赖项),因此这可以看作是一种优化。对库的第二次调用(他们使用返回值的地方)应该更快完成。

参见 documentation

If the specified module is a DLL that is not already loaded for the calling process, the system calls the DLL's DllMain function with the DLL_PROCESS_ATTACH value.

也来自文档。

Do not make assumptions about the operating system version based on a LoadLibrary call that searches for a DLL. If the application is running in an environment where the DLL is legitimately not present but a malicious version of the DLL is in the search path, the malicious version of the DLL may be loaded

假设硬编码 DLL 位置会使您的程序面临各种恶作剧!

关于c - LoadLibrary 调用,返回的指针未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8822969/

相关文章:

c# - 在使用时换出 DLL

c - C 中的 Struct 排序、比较和显示

c - 免费动态分配的内存

c++ - OpenCV中的基本颜色还原算法

使用 CMake 正确设置链接器标志

java - 内部调用另一个 dll 的 JNI DLL 的依赖项

javascript - 优化 Javascript 中首字母的搜索

c++ - 优化循环并避免模板特化中的代码重复

c - 什么是计算 floor(log(m/n)) 的有效方法,其中 m 和 n 是整数?

.net - 如何检测dll的类型? (COM、.NET、WIN32)