cx_freeze bdist_msi:创建注册表项?

时间:2018-08-02 14:38:53

标签: windows-installer cx-freeze

我过去使用过cx_freeze中的bdist_msi,效果很好。

现在我需要创建注册表项

是否可以通过cx_freeze中的bdist_msi创建注册表项?

使用wixtools这些设置是过去完成的:

<!-- File extension .foostarter -->
<RegistryValue Root='HKCR' Type='string' Key='.foostarter' Value='foostarter.File' />
<RegistryValue Root='HKCR' Type='string' Key='.foostarter' Name='Content Type' 
                           Value='application/vnd.foobar-modstarter' />
<RegistryValue Root='HKCR' Key='foostarter.File\Shell\Open' Type='string' Value='Ausfuehren' />
<RegistryValue Root='HKCR' Key='foostarter.File\Shell\Open\Command' Type='string'
               Value='"[#foostarter.exe]" file "%%1"' />

<!-- protocol foostarter://... -->
<RegistryValue Root='HKCR' Key='foostarter' Type='string' Value='URL: foostarter Protocol' />
<RegistryValue Root='HKCR' Key='foostarter' Type='string' Name='URL Protocol' Value=''/>
<RegistryValue Root='HKCR' Key='foostarter\shell\open\command' Type='string' 
               Value='"[#foostarter.exe]" url "%%1"' />

<!-- start without asking -->
<RegistryValue Root='HKLM' Key='Software\Microsoft\Internet Explorer\ProtocolExecute\foostarter' 
               Name='WarnOnOpen' Value='0' Type='integer' />

3 个答案:

答案 0 :(得分:1)

您需要出于什么目的创建注册表项?

cx_Freeze文档不完整:bdist_msi命令比currently listed ones add_to_pathupgrade_code具有更多选项。它有一个选项(kwarg)data(请参阅cx_Freeze的源代码),可用于向Windows Installer database tables添加条目。请参阅here,了解如何通过将条目添加到快捷方式表(Shortcut的键data)和目录表(键Directory)中来使安装程序创建桌面或程序菜单快捷方式)。同样,您可以使用键Registry将信息添加到Registry Table,并使用键RemoveRegistry将信息添加到RemoveRegistry Table,告诉安装程序将信息写入注册表在安装时将其删除,在卸载时将其删除。

您可以使用Orca来查看wixtools使用设置在注册表表和组件表(可能还有其他表)中生成哪些条目,并在安装脚本中定义完全相同的表并将其传递给{{ 1}}使用bdist_msi

您还可以通过Properties(键data)添加Property Table,通过InstallUISequence表,对话框表,控制表和ControlEvent表等添加用户界面。 ..有关可用键的列表,请参见here,其中包含指向相应数据库表文档的链接。

出于更复杂的目的,您可能需要在运行cx_Freeze安装脚本之后使用其他工具来生成安装程序。例如,请参见基于脚本的工具NSIS (Nullsoft Scriptable Install System)

答案 1 :(得分:1)

我正在回答自己的问题。我认为此解决方案应该有效:

首先使用bdist_msi创建msi文件。

然后更改创建的msi文件。您可以使用python库msilib.向表Registry中添加一个条目,记录在这里:https://docs.microsoft.com/en-us/windows/desktop/msi/registry-table

由于在setup.py中,我无法使用cx_freeze的未记录的“数据”参数,因为它使用了msilib.add_data() 。这种方法需要组件的外部键。

在setup.py期间我不知道此组件ID。

这就是为什么我认为您需要分两个步骤进行操作的原因。

以上只是理论。在实践中,我使用了bdist_exe,然后使用wix创建了msi。

由于上述只是模糊的猜测,因此非常欢迎反馈。

答案 2 :(得分:1)

MSI-MS SQL

我对 bdist_msi 不熟悉。但是,如果您有合适的工具,那么绝对有可能对MSI文件进行后处理以添加注册表项。我不确定您是否要将此脚本编写成脚本并自动执行,或者使用适当工具进行任何手动操作是否可以?

从使用python库msilib可以理解,MSI文件实际上是底层的原始MS SQL数据库,您可以使用自动化和原始SQL方言对其进行更新。请参阅下面的“ Hotfixing MSI using WiRunSQL.vbs ”。 msilib可能只是访问MSI COM API的包装程序,或者是访问底层的Win32 C++ functions的包装程序,您会发现我对Python知之甚少:-)。 Some context on COM vs Win32(我认为对您而言并不重要)。

如果您在MSI数据库表中插入条目,则实际上并不需要知道bdist_msi生成的组件名称,可以在Component table和{{ 1}},以及您需要的任何记录(由Registry table创建的记录除外)。然后,您还需要写入bdist_msi以将组件添加到功能中。我认为这不是很琐碎,但也没有那么糟糕。我没有使用msilib的示例Python代码,但这听起来您已经拥有了吗?也许是使用常规MSI API的示例?去吧:

使用WiRunSQL.vbs 对MSI进行修补: MSI SDK 中有一个名为WiRunSQL.vbs的VBScript,可用于以非常简单的方式(只是简化的SQL)以脚本方式将数据直接插入MSI文件中。 I describe this briefly in this answer (bottom)。如果已安装Visual Studio,只需在 FeatureComponents table 下搜索VBScript文件。

  

轻松修复? :上面的SQL修补程序VBScript是否能满足您的需要?它非常易于使用和自动化,并且是Microsoft VBScript。很少有其他纠缠和间接层。

快速MSI更新模型

对MSI进行的示例更改(打开指向MSDN的链接以查看每一列的含义):

Component Table:rolling with standard Pope-Mo-GUID Program Files (x86)

:-)MyComp{77777777-7777-7777-7777-777777777777}TARGETDIR4

Registry Table:

MyValueMyValue-1Software\[Manufacturer]\[ProductName]\New_KeyValue1

FeatureComponents Table:

MyCompMyFeature


使用工具的手动调整:

我希望以上所述具有某种意义。让我介绍一些“手动”或非脚本化/非自动化的替代方法:

免费工具 There are several tools you can try。该链接描述了免费的 Orca (正式的Microsoft SDK MSI查看器和编辑器-如果您安装了Visual Studio,请尝试在 {{下搜索 MyComp 1}} -然后安装它), SuperOrca InstEd 。这些是免费工具。

具有免费功能的商业工具 :还有Advanced Installer-一种商业工具,它允许免费使用一些基本功能。我认为这包括添加注册表项。我刚刚测试了它可以在完整版中使用。与Orca或其他免费工具相比,该工具的GUI更好-可以自动更新所有关联的表。我不知道InstallshieldPACE Suite(其他主要的商业工具)中是否有任何免费功能,但是如果您已经可以使用它们,那么它们可以轻松地完成工作。快速提一下:List of major, established deployment tools

WiX :看到somewhat familiar with WiX时,一种选择是使用WiX(重新)构建整个安装程序。也许你已经这样做了?您可以使用 Orca-x86_en-us.msi 将现有的MSI反编译为WiX格式。 This dark.exe process is described here(第4节)。然后,您可以更新WiX XML并重新编译-尽管这可能需要一些技巧和技巧。


某些链接