【问题标题】:What to use to build an installer using Delphi 7? [closed]使用 Delphi 7 构建安装程序的方法是什么? [关闭]
【发布时间】:2011-12-01 03:25:37
【问题描述】:

(注意:在下面添加了“重要编辑”以基本上以不同的方式重新提出这个问题)

我知道有许多不同的软件包可以放入 delphi 应用程序中以进行软件安装。我不需要任何花哨的东西,我只需要能够执行一些基本的安装例程,例如正确安装/替换 DLL。我可以手动完成大部分安装,比如复制文件、保存注册表设置等。我只需要让我的安装程序在 Windows(或更新的软件)上正确注册新软件所需的一切。

如果它可以例如在尝试替换文件之前检查文件当前是否正在使用,也会很有帮助。不需要任何视觉,必须有某种简单的非视觉组件可以处理这些常见的例程。如果可能的话,它也应该是免费的开源软件。我不想使用我的安装程序分发大量 DLL 或其他第三方文件。

有什么好的建议吗?请不要回答任何庞大复杂的花哨安装系统。它只需要简单的可以直接在 Delphi 中使用。它甚至不必是一个组件,甚至只是一个具有某些功能或类似功能的单元或单元库,以帮助自动化这些常见的安装。

补充说明:我已经有一个用 delphi-7 制作的安装程序,但我想在我的项目中添加一些东西,其中包括安装软件最常见部分的任何类型的帮助。


重要编辑:

我认为我提出这个问题的方法是错误的。请允许我重新详细说明...

我们公司已经有一个简单的更新实用程序。实际上,这不是一个“安装程序”,而是一个“更新程序”。它只是替换了一些 EXE 文件,执行 SQL 语句(MSSQL 服务器),写入一些注册表项等......

这些是我在这个程序目前的工作方式上面临的问题:

  • 尝试替换 DLL 时,DLL 可能正在使用中,因此 90% 的时间无法替换 DLL。我需要一些可以检查 DLL 是否正在使用的东西,并且(如果可能的话)要么强制替换 DLL,要么告诉 Windows 在下次重新启动时替换 DLL。
  • EXE 名称是“Setup.exe”,Windows 7 会自动将其识别为安装程序(并认为安装失败)。我知道有解决方法,事实上,我最近在 stackoverflow 上看到了一个针对这种情况的问题。我想看看是否已经准备好我得到的任何东西可以解决这个问题,而不是我手动完成工作。
  • 这是我正在使用的服务器/客户端系统。如果安装在服务器上,还需要更新(替换)服务EXE。我知道如何启动/停止服务,但是在等待服务停止,然后替换文件,然后重新启动时遇到了很多困难。我想看看这是否可以自动化。
  • 执行一个大型 SQL 脚本(我的意思是这个脚本中有超过 25,000 行)是地狱,而且一半时间都不起作用。它包括许多标准组件(例如 ADO)无法识别的“GO”实例。我可以使用批处理文件来执行此操作,但这比我所接受的要脏一些。必须有一种方法可以在不使用批处理文件的情况下执行此类脚本 - 尤其是读取结果并尝试确定更新中是否存在任何错误。
  • 此更新程序还将安装另一个第三方安装程序,特别是 SQL Native Client 驱动程序。我想要一些已经准备好启动另一个安装程序并等待它的结果(成功或失败)的东西。如果失败,我需要知道以不同的方式继续更新程序。

我可以理解要理解我的要求是多么困难。我不需要一个可以用于任何事情的解决方案。这是针对这个软件的,仅此而已。我知道可能没有一种单一的解决方案可以涵盖上述所有内容,但任何帮助都会很棒。

【问题讨论】:

  • 您要求在一个组件中提供很多功能(并通过“手动安装大部分”来自己做很多工作)。我发布了一个不是组件的答案;如果它对您不起作用,请投反对票。 :)
  • 您正在寻找的功能不仅仅是一个“简单的组件”。更新、在 Windows 中注册、延迟更新正在使用的文件等。InnoSetup(如我的回答中所述)生成单个可执行文件(没有外部 DLL,单个文件分发,处理您的所有要求等等,并附带完整的 Delphi 源代码,并由数十万 Delphi 和非 Delphi 开发环境的用户完全调试和测试)似乎是一件轻而易举的事。我不确定你的实际项目(或工作)需要什么,但你显然有很多额外的“重新发明轮子”时间。 :)
  • Jerry,如果您想要一个免费、简单且有效的安装程序,请使用 InnoSetup。它将完成您的所有任务。另一种方法是创建一个 msi 文件,但我不能推荐一个工具。通常,msi 文件比 InnoSetup 复杂得多。
  • 这个问题非常广泛和模糊。您一次问了太多问题,而没有提供足够的细节。
  • 投票结束,因为这是一个广泛的讨论主题,塞进一篇小论文,而不是一个问题。

标签: delphi installation delphi-7


【解决方案1】:

虽然它不是一个组件,但我还是发布了这个。 (当有很好的替代方案时,尝试手动完成安装程序的工作是在浪费您的时间,IMO,但如果您认为这个答案不可接受,请随意投反对票。)

InnoSetup 做得很好,并且(奖励)是用 Delphi 编写的,并且有可用的源代码。它可以满足您在安装程序中的所有需求(创建 .msi 文件除外,一些大型网络管理员需要这些文件 - 这不会影响您,因为您愿意自己编写大部分安装代码)。

您需要获取 IsTool GUI 界面(可从下载页面获得),它可以更轻松地配置安装脚本。

另一个好处:您可以使用它的Pascal Scripting 功能对其进行扩展。

【讨论】:

  • 那是我忘记名字的那个!过去我曾多次听说过这个名字,让我大吃一惊。我去试试,看看哪里能买到,谢谢。
  • Jerry,我使用 GUI 工具在 10 分钟内构建了非常简单的安装(创建文件夹、复制文件、创建文件关联)。我还创建了具有自定义配置、可选附加组件、确定需要安装什么的系统配置所需信息、单独的 32 和 64 bilt 安装以及复杂的注册表项的安装,以及可能的特定 .net 框架的可选下载版本,使用 Pascal 脚本逻辑确定是否需要安装并返回 URL 以用于下载它们)。再一次,它是完整的,100% 来源。
  • 只需我的 2 美分...我们的一位项目安装人员完成了 OP 编辑​​中的所有要点 - 全部使用 Inno。然而,我们使用 Inno 调用一个小的 Delphi 程序来进行 SQL 更新,因为这使用 Delphi 更容易管理。我们只从同一个脚本进行完整安装或升级;运行自定义帮助 DLL;如果需要,安装 Microsoft 可再发行组件;替换事件管理器资源 DLL;停止/替换/重新启动服务器服务。等待服务停止并被 Windows 释放是一个问题,但它是可行的。 Inno 是小型和大型装置的最佳选择!
  • @JerryDodge,如果 vanilla Inno Setup 对您来说太多(或太少),请编写一些提供您需要的确切灵活性的内容,但使其生成 ISS 脚本,而不是实际的安装程序。作为记录,我正在使用 Inno 安装/升级 Firebird SQL 服务器。这包括确定它是否已经安装、是否需要升级、停止服务、运行 Firebird 的安装程序、更新 UDF DLL、重新启动服务器。
  • InnoSetup 也是一个很棒的更新程序,而不仅仅是一个安装程序。事实上,它比几乎任何其他工具都更适合更新,因为它稳定、实用且体积小。这就是更新程序应该是的。
【解决方案2】:

以下是对您的大量问题的一些答案:

尝试替换 DLL 时,DLL 可能正在使用中,因此 90% 的时间无法替换 DLL。我需要一些可以检查 DLL 是否正在使用的东西,并且(如果可能的话)要么强制替换 DLL,要么告诉 Windows 在下次重新启动时替换 DLL。

调用MoveFileEx传递MOVEFILE_DELAY_UNTIL_REBOOT。

EXE 名称是“Setup.exe”,Windows 7 会自动将其识别为安装程序(并认为安装失败)。我知道有解决方法,事实上,我最近在 stackoverflow 上看到了一个针对这种情况的问题。我想看看是否已经准备好我得到的任何东西可以解决这个问题,而不是我手动完成工作。

将应用程序清单添加到您的 setup.exe 程序。最近确实在这里讨论过这个问题:How do I get my Installer Application to behave correctly with Windows?

这是我正在使用的服务器/客户端系统。如果安装在服务器上,还需要更新(替换)服务EXE。我知道如何启动/停止服务,但是在等待服务停止,然后替换文件,然后重新启动时遇到了很多困难。我想看看这是否可以自动化。

我知道停止服务的所有标准方法都等到它停止运行。

执行大型 SQL 脚本(我的意思是该脚本中有超过 25,000 行)是地狱,而且一半时间都不起作用。它包括许多标准组件(例如 ADO)无法识别的“GO”实例。我可以使用批处理文件来执行此操作,但这比我所接受的要脏一些。必须有一种方法可以在不使用批处理文件的情况下执行这样的脚本——尤其是读取结果并尝试识别更新中是否有任何错误。

此更新程序还将安装另一个第三方安装程序,特别是 SQL Native Client 驱动程序。我想要一些已经准备好启动另一个安装程序并等待它的结果(成功或失败)的东西。如果失败,我需要知道以不同方式继续更新程序。

我认为这些观点过于笼统,无法提供建议。


在 InnoSetup 等优秀的第三方安装程序的帮助下,所有这些问题都会变得微不足道。我不明白你为什么不愿意利用这么有用的帮助。

【讨论】:

  • 我有很多理由不使用新系统,主要是因为 1)我们已经有了更新程序,只是需要添加,2)这不取决于我,取决于我老板和用户社区,以及 3) 现有的更新实用程序还有很多其他现有功能,出于保密原因,我不打算解释。
  • @Jerry 很可能从 Inno 或类似工具调用您现有的代码。它不必是一种或另一种方式,有很好的混合解决方案。不管怎样,我想你现在已经听到了这个消息! ;-) 我希望我已经用上述内容回答了你的一些问题。
  • @Jerry:你有没有问过自己,为什么即使是大型软件公司也选择商业安装程序来编写自己的?创建一个好的安装程序很复杂,需要对安装过程有很好的了解。如果出现问题,好的安装程序能够“回滚”更改,并使系统尽可能干净。您正在重新发明轮子,并且在真实系统上“测试”您的安装程序时,您只是冒着损坏它们的风险。您对如何执行某些操作缺乏了解,这表明最好避免使用 DIY 方法。但你不会改变主意。
【解决方案3】:

JCL library 包含许多您需要的低级 Windows 功能。大多数可以通过 Windows API 完成的事情都可以在 JCL 中使用。

请参阅previous question,了解您需要采取哪些措施来防止“此程序可能未正确安装”消息。

过去,我为 MS SQL 数据库编写了一个类似的数据库更新程序,其中包含许多 Go 语句。我使用了一个VB脚本。与您现在所拥有的相比,这可能不会有很大的改进,但它确实包括流量控制和陷阱错误。您可以在 Delphi 中链接到 Windows Script Host,但我的主要观点是弄清楚您的 DBMS 公开了哪些接口并使用它们。

这里有一个关于 DLL 的提示。不要将它们放在 Windows 系统文件夹中。将它们放在与可执行文件相同的文件夹中。这可以防止其他人共享您的 DLL。这样,当您的程序关闭时,不会加载 DLL,您可以替换它们。如果您使用的是共享系统 DLL,则无法重新启动。

如果此更新程序是面向公众的,请不要忘记签名并放入应用程序清单,以便用户获得良好的体验。

我建议一次解决一个问题,除非您的应用程序欢迎测试单元,否则请编写一个小程序来测试每个解决方案。

除此之外,我想说的是深入肘部并开始编写代码。

【讨论】:

  • 谢谢,这是这里唯一得到专业回答而不是讽刺和粗鲁的评论。
  • @Jerry 再次阅读 cmets 和答案。我没有看到太多讽刺和粗鲁的证据。事实上,我看到很多人放弃他们的时间,并认真地试图提供帮助。人们提供与你完全不同的观点这一事实并不等同于粗鲁。
  • 现在我感觉很糟糕,因为我也投票给了其他“粗鲁”的答案。 :)
  • @DavidHeffernan 哎呀,我使用了错误的运算符,or 不是 and - 你的回答确实没有什么粗鲁的,但是“你的一长串问题”和“你为什么不情愿”的立场对我来说是讽刺。问这个问题时,我有很多困惑和愤怒,我也投票结束。我真的很感谢所有的帮助,我不能同时接受这两个答案,但我坚信专业精神——这是一个专业的网站,对吗?
  • @Jerry 我避免在 Stack Overflow 上使用讽刺。我的 cmets 批评了你,但直接批评了你,而不是讽刺。如果你包含他们的范围,问题会更好地工作。在我看来,这个问题太宽泛了。关于 不情愿 的引用,这里也没有讽刺意味。只是直接。我试图挑战你以不同的方式思考。就是这样。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2023-03-03
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多