如何强制VB6使用应用程序目录中的DLL和OCX?

16

我想把我的依赖文件放在应用程序目录中。

我记得你可以强制VB6只使用本地目录中的文件。

有什么提示吗?

5个回答

12

7
将组件库放置在EXE文件夹中(带或不带.local文件)也可能对目标机器的卫生产生负面影响。
如果VB6程序尚未注册,则会通过自我注册入口在后台注册这里的组件。然后,如果应用程序被移动或删除,则会使用户留下一个损坏的注册表 - 这可能对随后安装的使用某些相同组件的应用程序致命。但是,这对于特定于应用程序的组件(即您自己的DLL或OCX,永远不需要其他应用程序使用)可能还可以接受。
.local技巧实际上并不适用于VB6程序,如果使用了它,您的安装程序需要知道并正确安装和注册组件,如果它们尚未在计算机上。它是一种手动黑客方式,可解决单个计算机上的DLL版本兼容性问题,而不是部署策略。
升级到SxS应用程序和程序集清单(无需注册COM等)以获得更好的解决方案。 DLL / COM重定向(.local)是一个不错的尝试,但它有许多缺点。

7
Clay Nichol关于搜索顺序的回答并不完全正确。该搜索顺序仅适用于非COM组件。即只适用于某些DLL,而不适用于OCX。如果您注册了COM对象,则将从注册它们的目录中使用它们,而不管本地目录中有什么,除非使用reg-free COM或.local文件。

编辑:

MakeMyManifest被认为是为VB6项目创建清单的自动工具,我自己没有尝试过。 DirectCOM也拥有粉丝,同样我也没有尝试过。

编辑 MMM网站已经关闭。我在这里看到作者在处理他们的托管时遇到了麻烦,并提供了另一个位置来获取Make My Manifest-在此下载

有一种半自动技术可以生成无需注册的COM清单。您可以使用Visual Studio 2008(可以使用免费版本,例如Visual Basic Express Edition)创建清单。然后手动进行一些编辑,使清单适用于从VB6使用。请参见此MSDN文章的this section部分,以获得逐步说明-忽略其余关于ClickOnce的内容。

6

这可能有点令人困惑,因为每个版本的Windows都会改变规则。旧版本的Windows在当前目录之前搜索路径。

没有清单文件的简单解决方案:

如果您的可执行文件是 A.EXE,请在相同的目录中添加一个(0字节,空)文件,命名为 A.EXE.local -- 对于旧版本的Windows,这将把应用程序目录放在搜索顺序中的路径之前。


1
这是Win2k+上的正确答案。 但请注意,如果A.EXE有嵌入式清单,或者存在A.EXE.manifest(例如启用无需注册COM、使程序DPI感知等),则.local文件将被忽略,因为清单旨在成为一种替代技术。如果是这种情况,在您的清单中,您可以简单地列出您想要从应用程序目录中使用的文件,以强制它们从那里加载:<file name="my.dll" /> - Eugene Talagrand

5

我自己找到了答案:

Windows首先会查找应用程序目录:

如果启用了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/ms682586.aspx

但是您可以使用清单将其重定向到.dll的搜索位置:

http://msdn.microsoft.com/en-us/library/aa375365(VS.85).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接