16

我想把我的依赖文件放在 app 目录中。

我似乎记得您可以强制 VB6 仅使用本地目录中的文件。

有什么提示吗?

4

5 回答 5

12

您可能还想尝试为您的项目设置Reg-Free COM。有一个名为Unattended Make My Manifest的免费软件可以为您完成大部分工作。

于 2008-12-08T18:47:41.800 回答
7

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

编辑:

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

编辑MMM 网站已关闭。我在这里看到作者在托管方面遇到了问题,并提供了另一个位置来获取 Make My Manifest -在此处下载

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

于 2008-12-09T17:36:02.583 回答
7

将组件库放在 EXE 文件夹中(带有或不带有 .local 文件)也可能对目标机器的卫生有害。

如果之前没有注册,VB6 程序将通过您背后的 self-reg 入口点在此处注册组件。然后,如果应用程序被移动或删除,您会给用户留下一个损坏的重新注册 - 对于随后使用某些相同组件安装的应用程序可能是致命的。这对于特定于应用程序的组件可能很好,即您自己的 DLL 或 OCX,其他应用程序永远不会需要。

.local 技巧实际上并不适用于 VB6 程序,如果使用它,您的安装程序需要了解并正确安装和注册组件(如果它们尚未在机器上)。它的目的是手动破解单个机器上的 DLL 版本兼容性问题,而不是部署策略。

升级到 SxS 应用程序和程序集清单(Reg-Free COM 等)以获得更好的解决方案。DLL/COM 重定向 (.local) 是一个很好的尝试,但它有很多缺点。

于 2009-01-17T18:55:34.793 回答
6

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

一个没有清单的简单解决方案:

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

于 2008-12-06T08:09:55.630 回答
5

自己找到的:

Windows 确实会先查看 App Directory:如果启用了 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

但是您可以使用 Manifest 重定向查找 .dll 的位置:

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

于 2008-12-05T21:11:43.477 回答