16

MSDN 说函数SetDllDirectory()可用于将目录插入到DLL Search Path中。是否可以从批处理文件或 cmd 脚本访问此功能,也许是通过cscript使用?

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

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

4

3 回答 3

17

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

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

set PATH=C:\path to your dll;%PATH%
于 2009-02-05T22:33:33.777 回答
13

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

如果 DLL 与可执行文件不在同一个文件夹中,Windows 将在系统路径中指定的文件夹中搜索文件。所以你需要做的就是把你的文件夹放在路径的开头。

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

 set PATH=c:\MyDLLFolder;%PATH%

如果您的路径包含空格,则需要使用以下批处理命令:

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

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

于 2009-02-05T23:43:00.827 回答
11

为了解决关于 dll 搜索顺序的争议(在@jussij 的答案的评论中),这里的列表来自微软的文档:

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

  1. 加载应用程序的目录。
  2. 系统目录。使用该GetSystemDirectory函数获取该目录的路径。
  3. 16 位系统目录。没有函数获取这个目录的路径,但是被搜索了。
  4. Windows 目录。使用该GetWindowsDirectory函数获取该目录的路径。
  5. 当前目录。
  6. PATH 环境变量中列出的目录。请注意,这不包括 App Paths 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 App Paths 键。

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

  1. 加载应用程序的目录。
  2. 当前目录。
  3. 系统目录。使用该GetSystemDirectory函数获取该目录的路径。
  4. 16 位系统目录。没有函数获取这个目录的路径,但是被搜索了。
  5. Windows 目录。使用该GetWindowsDirectory函数获取该目录的路径。
  6. PATH 环境变量中列出的目录。请注意,这不包括 App Paths 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 App Paths 键。

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#standard_search_order_for_desktop_applications

于 2014-08-20T14:42:38.467 回答