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

C++ 阻止Windows在解析dll依赖项时使用PATH env变量?,c++,windows,dll,C++,Windows,Dll,加载DLL(使用LoadLibrary/Ex动态加载或静态加载)时,是否有可能阻止Windows使用PATH环境变量查找DLL/加载DLL所依赖的其他DLL 我可以找到的文档似乎暗示没有办法阻止搜索路径,但也许我遗漏了什么 我问这个问题的原因是,我们希望有一个快速失效的场景,当应用程序文件夹中缺少(静态)链接的DLL,但路径上可能存在(不同版本)时。您可以在加载DLL之前从代码中更改PATH环境变量。对于动态加载的DLL:控制加载哪个DLL的最简单方法是不调用搜索逻辑。仅当提供了部分路径时才调用

加载DLL(使用
LoadLibrary
/
Ex
动态加载或静态加载)时,是否有可能阻止Windows使用PATH环境变量查找DLL/加载DLL所依赖的其他DLL

我可以找到的文档似乎暗示没有办法阻止搜索路径,但也许我遗漏了什么


我问这个问题的原因是,我们希望有一个快速失效的场景,当应用程序文件夹中缺少(静态)链接的DLL,但路径上可能存在(不同版本)时。

您可以在加载DLL之前从代码中更改PATH环境变量。对于动态加载的DLL:控制加载哪个DLL的最简单方法是不调用搜索逻辑。仅当提供了部分路径时才调用搜索逻辑-在调用LoadLibrary时提供dll的完全限定路径,如果该dll不存在于该位置,则调用将失败

对于静态加载的DLL:作为程序集一部分的DLL仅在WinSxS和应用程序文件夹中搜索。因此,创建一个“虚拟”程序集来保存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不在同一文件夹中,它将无法加载。

谢谢,非常好的信息!对于我不控制但应存在于应用程序文件夹中的第三方dll,它是否仍能与.manifest文件一起工作?(1)您无需对dll进行任何更改即可将其添加到程序集。因此,这将适用于第三方DLL和您自己的DLL。(2) 如果有多个dll,可以通过重复节点将它们添加到单个程序集。(3)如果调用LoadLibrary来加载依赖于这些第三方dll的dll,并希望在dll加载失败时快速检测:需要#pragma指令的是dll,而不是exe。第三方dll需要在dll文件夹中,而不是exe文件夹中(如果不同的话)。这实际上可能有效!我的问题是,我有一个动态加载的DLL,但我想确保它的静态依赖关系不是通过PATH解决的。因此,我可能可以在调用LoadLibrary之前抓取PATH变量,并在LoadLibrary完成后恢复它。如果进程中的任何其他线程可能正在执行使用它的操作—可能包括由OS或COM或您使用的其他组件创建的线程,而不仅仅是您自己创建和了解的线程—那么您可能会因此引入神秘的、偶然的失败。但是,在流程开始时正确地进行操作,确保在开始使用它之前加载所有内容应该是相当安全的。
#pragma comment(linker, "/manifestdependency:\"dummyassembly'"\
                       " processorArchitecture='*' version='1.0.0.0' type='win32'\"")