我想把我的依赖文件放在 app 目录中。
我似乎记得您可以强制 VB6 仅使用本地目录中的文件。
有什么提示吗?
您可能还想尝试为您的项目设置Reg-Free COM。有一个名为Unattended Make My Manifest的免费软件可以为您完成大部分工作。
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 的其余文章。
将组件库放在 EXE 文件夹中(带有或不带有 .local 文件)也可能对目标机器的卫生有害。
如果之前没有注册,VB6 程序将通过您背后的 self-reg 入口点在此处注册组件。然后,如果应用程序被移动或删除,您会给用户留下一个损坏的重新注册 - 对于随后使用某些相同组件安装的应用程序可能是致命的。这对于特定于应用程序的组件可能很好,即您自己的 DLL 或 OCX,其他应用程序永远不会需要。
.local 技巧实际上并不适用于 VB6 程序,如果使用它,您的安装程序需要了解并正确安装和注册组件(如果它们尚未在机器上)。它的目的是手动破解单个机器上的 DLL 版本兼容性问题,而不是部署策略。
升级到 SxS 应用程序和程序集清单(Reg-Free COM 等)以获得更好的解决方案。DLL/COM 重定向 (.local) 是一个很好的尝试,但它有很多缺点。
这可能有点令人困惑,因为每个版本的 Windows,规则都会改变。旧版本的 Windows 在当前目录之前搜索路径。
一个没有清单的简单解决方案:
如果您的可执行文件是A.EXE
,请在名为 -- 对于旧版本的 Windows 的同一目录中添加一个(0 字节,空)文件,A.EXE.local
这会将应用程序目录放在搜索顺序中的路径之前。
自己找到的:
Windows 确实会先查看 App Directory:如果启用了 SafeDllSearchMode,则搜索顺序如下:
如果禁用 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