在解析dll依赖项时阻止Windows使用PATH env变量?

时间:2010-12-09 11:43:23

标签: c++ windows dll

当加载DLL(动态地使用LoadLibrary / Ex或静态)是否有可能阻止Windows使用PATH环境变量来查找DLL / DLL的其他DLL加载取决于?

我能为Dynamic-Link Library Search Order找到的文档似乎暗示没有办法阻止搜索PATH,但也许我错过了什么?

我之所以这样问的原因是,我们希望有一个快速失败的方案,当应用程序文件夹中缺少(静态)链接的DLL但可能存在于PATH上时(不同版本)。

2 个答案:

答案 0 :(得分:5)

对于动态加载的dll:控制加载哪个dll的最简单方法是不调用搜索逻辑。只有在提供部分路径时才会调用搜索逻辑 - 在调用LoadLibrary时提供dll的完全限定路径,如果该位置中不存在Dll,则调用将失败。

对于静态加载的dll:仅在WinSxS和应用程序的文件夹中搜索属于程序集一部分的Dll。因此,创建一个“虚拟”程序集来保存dll。这就像使用以下内容创建.manifest文件一样简单:

<!-- dummyassembly.manifest -->

<assembly manifestVersion="1.0">
    <assemblyIdentity type="Win32" name="dummyassembly" version="1.0.0.0" processorArchitecture="x86"/>
    <file name="thedll.dll"/>
</assembly>

将此代码添加到任何只需要使用精确dll的项目中:

#pragma comment(linker, "/manifestdependency:\"dummyassembly'"\
                       " processorArchitecture='*' version='1.0.0.0' type='win32'\"")

如果同一文件夹中不存在dll,则无法加载。

答案 1 :(得分:2)

您可以在加载dll之前从代码更改PATH环境变量。然后可能在之后恢复它。