使用Delphi 7构建安装程序有什么用?

时间:2011-12-01 03:25:37

标签: delphi installer delphi-7

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

我知道有很多不同的软件包可以放在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行)是地狱,并且一半时间不起作用。它包括许多“GO”实例,这些实例无法被标准组件识别,例如ADO。我可以使用批处理文件来执行此操作,但这比我感觉更糟糕。必须有一种方法来执行这样的脚本而不使用批处理文件 - 特别是读取结果并尝试识别更新中是否有任何错误。
  • 此更新程序还将安装另一个第三方安装,特别是 SQL Native Client Drivers 。我想要一些已准备好启动另一个安装程序并等待其结果(成功或失败)的东西。如果失败,我需要知道以不同方式继续更新程序。

我能理解如何理解我所要求的内容。我不需要一个可以用于任何东西的解决方案。这是针对这一个软件,没有别的。我知道可能没有一个单一的解决方案可以涵盖上述所有内容,但任何帮助都会很棒。

3 个答案:

答案 0 :(得分:19)

虽然它不是一个组件,但无论如何我都会发布这个。 (当有很多替代方案时,尝试手动完成安装程序的工作是浪费你的时间,IMO,但如果你发现它不可接受,可以随意投票给这个答案。)

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

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

另一个好处:您可以使用Pascal Scripting功能扩展它。

答案 1 :(得分:2)

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

  

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

通过MOVEFILE_DELAY_UNTIL_REBOOT致电MoveFileEx

  

EXE名称是'Setup.exe',Windows 7会自动将其识别为安装程序(并认为它无法安装)。我知道有这方面的解决方法,事实上,我最近在stackoverflow上看到了这个问题的一个问题。我想知道是否已经准备好了我能得到的东西,而不是我手动完成这项工作。

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

  

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

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

  

执行一个大的SQL脚本(我的意思是在这个脚本中超过25,000行)是地狱,并且一半时间不起作用。它包括许多“GO”实例,这些实例无法被标准组件识别,例如ADO。我可以使用批处理文件来执行此操作,但这比我感觉更糟糕。必须有一种方法来执行这样的脚本而不使用批处理文件 - 特别是读取结果并尝试识别更新中是否有任何错误。

     

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

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


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

答案 2 :(得分:1)

JCL library包含许多您需要的低级Windows功能。 JCL中提供了大多数可以通过Windows API完成的任务。

请参阅previous question,了解如何防止“此程序可能未正确安装”消息。

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

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

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

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

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