Batch file 是否可以从批处理文件或cmd脚本向DLL搜索路径添加目录?

Batch file 是否可以从批处理文件或cmd脚本向DLL搜索路径添加目录?,batch-file,cmd,dll,wsh,Batch File,Cmd,Dll,Wsh,MSDN表示,该函数可用于将目录插入到。可以通过批处理文件或cmd脚本访问此函数吗 我们的目标是在%WINDIR%等中预先存在的旧dll之前找到我们的dll开发版本,而不必为此编写程序 提前感谢您的时间和想法。您可以将DLL放置在与可执行文件相同的路径中,首先在%WINDIR%之前搜索该路径。无法直接从批处理文件调用SetDllDirectory 但是,您可以在%PATH%变量中插入DLL目录,Windows将在那里找到DLL set PATH=C:\path to your dll;%PATH

MSDN表示,该函数可用于将目录插入到。可以通过批处理文件或cmd脚本访问此函数吗

我们的目标是在%WINDIR%等中预先存在的旧dll之前找到我们的dll开发版本,而不必为此编写程序


提前感谢您的时间和想法。

您可以将DLL放置在与可执行文件相同的路径中,首先在%WINDIR%之前搜索该路径。无法直接从批处理文件调用SetDllDirectory

但是,您可以在%PATH%变量中插入DLL目录,Windows将在那里找到DLL

set PATH=C:\path to your dll;%PATH%
目的是为了我们的发展 在安装之前找到的dll的版本 %WINDIR%中预先存在的旧版本 等,而不必编写程序 就为了这个

如果DLL与可执行文件不在同一文件夹中,Windows将在系统路径中指定的文件夹中搜索该文件。因此,您只需将文件夹放在路径的开头

可以使用以下批处理命令执行此操作:

 set PATH=c:\MyDLLFolder;%PATH%
 set PATH="C:\My DLL Folder";%PATH%
如果路径包含空白,则需要使用以下批处理命令:

 set PATH=c:\MyDLLFolder;%PATH%
 set PATH="C:\My DLL Folder";%PATH%

但请记住,此路径更改仅对当前控制台会话的路径进行。如果关闭并重新打开控制台,这些路径更改将丢失。

要解决dll搜索顺序上的争议(在@jussij的回答中),以下列表来自Microsoft的文档:

如果启用了
SafeDllSearchMode
,则搜索顺序如下:

  • 从中加载应用程序的目录
  • 系统目录。使用
    GetSystemDirectory
    函数获取此目录的路径
  • 16位系统目录。没有获取此目录路径的函数,但会对其进行搜索
  • Windows目录。使用
    GetWindowsDirectory
    函数获取 此目录的路径
  • 当前目录
  • PATH环境变量中列出的目录。请注意,这不包括应用程序路径注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用应用路径键
  • 如果禁用了
    SafeDllSearchMode
    ,则搜索顺序如下:

  • 从中加载应用程序的目录
  • 当前目录
  • 系统目录。使用
    GetSystemDirectory
    函数获取此目录的路径
  • 16位系统目录。没有获取此目录路径的函数,但会对其进行搜索
  • Windows目录。使用
    GetWindowsDirectory
    函数获取此目录的路径
  • PATH环境变量中列出的目录。请注意,这不包括应用程序路径注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用应用路径键

  • 这个跳跃在中间。搜索1)调用.exe所在的目录后,Windows搜索2)系统目录,3)16位系统目录,4)Windows目录,5)当前目录,6)最后搜索%path%。请参阅问题中的/DLL搜索路径/链接。您的答案对于EXE、BAT、COM搜索路径是正确的(据我所知)。Matt,这就是为什么我用“如果DLL与可执行文件不在同一文件夹中”来限定我的评论的原因。至于那些愚蠢到将非系统dll放入系统文件夹的人,祝他们好运;)“如果DLL与可执行文件不在同一文件夹中”的限定是正确的,但“您只需将文件夹放在路径的开头”是错误的。在系统和windows目录之后才会搜索路径。为什么要在系统文件夹中放置非系统dll?我从来没有必要这样做,甚至会说这是一件非常愚蠢的事情。我一直使用这种方法,它从未让我失望。只需将系统文件夹留给系统,一切正常;)