你如何强制VB6使用app目录中的DLL和OCX?

时间:2008-12-05 20:57:01

标签: vb6 regfreecom

我想将我的相关文件放在app目录中。

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

任何提示?

5 个答案:

答案 0 :(得分:12)

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

编辑 MMM网站已关闭。我看到here作者在托管时遇到了问题,并提供了另一个获取Make Make Manifest的位置 - download it here

答案 1 :(得分:6)

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

编辑:

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

编辑 MMM网站已关闭。我看到here作者在托管时遇到了问题,并提供了另一个获取Make Make Manifest的位置 - download it here

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

答案 2 :(得分:6)

将组件库放置在EXE文件夹中(带或不带.local文件)也会对目标机器的卫生造成损害。

如果以前没有注册过,VB6程序会通过你背后的自我输入点在这里注册组件。然后,如果移动或移除应用程序,则会使用户的注册损坏 - 可能对使用某些相同组件的后续安装的应用程序造成致命影响。对于特定于应用程序的组件,这可能很好,即您自己的DLL或OCX,其他应用程序永远不会

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

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

答案 3 :(得分:5)

自己找到它:

Windows首先会在App Directory中查找: 如果启用了SafeDllSearchMode,则搜索顺序如下:

  1. 加载应用程序的目录。
  2. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
  3. 16位系统目录。没有函数可以获取此目录的路径,但会搜索它。
  4. Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
  5. 当前目录。
  6. PATH环境变量中列出的目录。请注意,这不包括App Paths注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用App Paths键。
  7. 如果禁用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

答案 4 :(得分:5)

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

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

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