5

我有另一个公司的应用程序插件。我的插件使用 Qt,所以它需要 Qt DLL。我的问题是所有版本的 4.x Qt Dll 都被称为相同的,例如:QtCore4.dll。很可能某些其他插件或其他将自身插入 PATH 环境变量的应用程序已将 Qt dll 放入应用程序文件夹中。在这种情况下,插件将不会启动,因为它需要不同版本的 DLL。

  • Q1。DLL 部署的建议常见做法是什么?
  • Q2。如果宿主应用程序使用不同版本的 Qt 会怎样。windows 会允许宿主应用程序和插件使用不同的版本 () 吗?

谢谢!

4

6 回答 6

3

只是为了帮助其他人解决这个问题:保证所有 4.X 版本的 QT DLL 都是相同的(或至少是二进制兼容的)。(对于所有 3.X 版本等都是一样的)所以不会有问题。这也是为什么 Qt dll 命名中没有第二个数字的原因。

于 2009-11-20T12:05:53.130 回答
3

A1:最佳实践:将 DLL 放在可执行文件的目录中。它将首先在此处查找以加载 DLL。这是常见的做法。

A2:如果应用程序以某种方式使用不同版本的 Qt 并且您所描述的模块需要更高版本或特定版本,则可能会导致问题(无法工作、崩溃等)。

使用静态链接,您还必须考虑 Qt 的许可证限制。只要库在运行时动态加载并且可以与应用程序分离,LGPL 就很高兴。这仅适用于您不发布源等情况。

此外,您的安装程序应设置对这些文件的访问权限,以防止它们被其他恶意应用程序覆盖。

于 2009-09-30T12:09:27.673 回答
1

对于自 XP 以来的 Windows 版本(即 XP、2003、Vista、2008 和 Win7),您可以使用并行程序集DLL 重定向。在任何一种情况下,本质上您所做的是包含一个小文本文件,该文件告诉操作系统您需要使用与可执行文件位于同一目录中的特定版本的 DLL。

这些是鲜为人知的功能,但它们确实可以将您的屁股从“DLL Hell”中拯救出来。

于 2009-09-29T19:05:29.350 回答
0

有没有办法选择与Qt静态链接?

我会将 DLL 部署在与我的应用程序/插件相同的目录中。

但是,这并不能回答您的其他问题。

于 2009-05-15T14:02:48.383 回答
0

就像蒂姆说的那样,您应该将 DLL 部署在与您正在制作的应用程序/插件相同的目录中。我相信 PATH 变量不是您的程序查找 QT4 dll 的第一个位置,因此如果您将它部署在同一个文件夹中,您的应用程序将使用您的应用程序选择一个并忽略 PATH 上的任何内容。

Q1:过去似乎每个人都将他们的 DLL 放在 system32 文件夹中,因为他们知道它在 PATH 上,并且知道那里的程序可以找到它。从用户的角度来看,当我想卸载某些东西时,我发现很难清理。现在,由于存储价格低廉,我会说将您的 DLL 保留在您的应用程序中,特别是如果它们像这样,可能有多个版本。虽然我不是专家,但这就是我为 Java 应用程序处理 jar 文件的方式。

Q2:我会这么认为。这将取决于应用程序和插件的目录结构。您可以告诉您的插件使用哪个版本,我敢打赌,该应用程序的版本也已经在一个特殊的地方。

于 2009-05-15T15:53:03.110 回答
0

为了安全起见,您必须确保您的应用程序使用您希望它使用的 dll 版本。Windows 保证首先查看应用程序文件夹。所以你应该把所有的二进制依赖项放在那里。

如果您在资源管理器中双击它时您的应用程序没有运行,Windows 会告诉您它需要什么 dll。将该 dll 复制到应用程序文件夹。如果您的应用程序运行,请转到下一步。

现在您应该暂时删除(或重命名)您放在应用程序文件夹中的dll,并且每次您应该双击您的应用程序。如果 Windows 没有抱怨,它会在其他地方找到 dll。将该 dll 从 PATH 环境中取出(可能是暂时的)。Rapid Environment Editor 是一个免费实用程序,可编辑立即生效的环境变量。

只有当您确定您的应用程序使用应用程序目录中的 dll 并且没有从其他地方拉入任何 dll 时,您才能再次开始编辑 PATH 变量以恢复旧情况。

于 2015-12-02T21:55:24.650 回答