如何配置Windows应用仅加载系统DLL 禁止加载exe所在目录DLL
Windows应用仅加载系统DLL的配置方案
Manifest配置方案(推荐,适配Windows 10 1607及以上版本)
这种方式不需要修改业务代码,直接通过嵌入EXE的manifest实现搜索路径限制:
- 在你的项目中新增XML格式的manifest文件,内容如下,替换其中的应用名称、版本、架构信息为你实际项目的值:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="你的应用名称" version="1.0.0.0" processorArchitecture="x86" publicKeyToken=""/> <!-- 这里保留你原有manifest里的依赖配置,比如通用控件依赖 --> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> </dependentAssembly> </dependency> <!-- 核心DLL搜索路径限制配置 --> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dllSearch xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">system32</dllSearch> </windowsSettings> </application> </assembly>
- 将manifest文件嵌入你的EXE即可:Visual Studio可以直接在项目属性的「清单工具」里指定manifest路径,其他编译环境可以用
mt.exe命令行工具嵌入。
代码配置方案(兼容Windows 7及以上版本)
如果需要适配更低版本的Windows系统,可以在程序入口最前端添加路径配置代码,优先级高于默认搜索规则:
- 在程序所有其他逻辑执行前,调用两个Windows API完成路径限制,代码示例如下:
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 移除当前目录的DLL搜索优先级 SetDllDirectoryW(L""); // 强制所有DLL仅从system32目录搜索 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); // 此处放置你原有程序的启动逻辑 // ... }
- 注意:如果你的项目使用了延迟加载的DLL,需要确保上述代码在任何延迟加载DLL被调用前执行,避免提前触发非预期路径的DLL加载。
内容的提问来源于stack exchange,提问作者Igor Bukanov
相关产品推荐
相关产品推荐

