You are here:  Home » Python » msilib- 读取和写入Microsoft Installer文件 – MS Windows特定服务(Python教程)(参考资料)

msilib– 读取和写入Microsoft Installer文件

源代码: Lib / msilib / __ init__.py


msilib支持创建Microsoft Installer(.msi)files。因为这些文件通常包含一个嵌入的“cabinet”文件(.cab),它还会提供一个API来创建CAB文件。目前尚未实现对.cab文件读取的支持;读取对.msi数据库的支持是可能的.

这个包旨在提供对.msi文件中所有表的完全访问,因此,它是一个相当低级的API。这个包的两个主要应用是distutils命令bdist_msi,以及创建Python安装程序包本身(虽然目前使用的是msilib的不同版本。)

包内容可以大致分为四个部分:低级CABroutines,低级MSI例程,更高级别的MSI例程和标准表结构.

msilib.FCICreate (cabname, files )
创建一个名为cabname. files必须是元组列表,每个元组包含磁盘上文件的名称,以及CAB文件中文件的名称.

文件按照它们在列表中出现的顺序添加到CAB文件中。使用MSZIP压缩算法将所有文件添加到单个CAB文件中.

目前,有关MSI创建的各个步骤的回调到目录.

msilib.UuidCreate ()
返回新唯一标识符的字符串表示形式。这包装了Windows API函数UuidCreate()UuidToString().
msilib.OpenDatabasepath, persist
通过调用MsiOpenDatabase返回一个新的数据库对象。path是MSI文件的文件名;persist可以是MSIDBOPEN_CREATEDIRECT, MSIDBOPEN_CREATE, MSIDBOPEN_DIRECT,MSIDBOPEN_READONLYMSIDBOPEN_TRANSACT的常数之一,并且可以包含MSIDBOPEN_PATCHFILE的标志。有关这些标志的含义,请参阅Microsoft文档;根据标志,打开一个现有的数据库,或者创建一个新的.
msilib.CreateRecord(count)
通过调用MSICreateRecord(). count返回一个新的记录对象记录的字段数量
msilib.init_databasename, schema, ProductName, ProductCode, ProductVersion, Manufacturer)
创建并返回一个新的数据库name,用schema初始化它,并设置属性ProductName, ProductCode, ProductVersion,并且Manufacturer.

schema必须是包含tables_Validation_records属性的模块对象;通常,msilib.schema应该被使用.

当这个函数返回时,数据库将只包含模式和验证记录.

msilib.add_data (database, table, records )
records全部添加到table中的database.

table参数必须是MSI模式中的预定义表之一,例如"Feature", "File", "Component", "Dialog", "Control",etc.

records应该是一个元组列表,每个元组都包含根据表格架构的所有字段字段。对于可选字段,None可以传递

字段值可以是二进制类的整数,字符串或实例.

class msilib.Binary (filename)
表示二进制表中的条目;使用add_data()插入这样的对象,将名为filename的文件读入表中.
msilib.add_tables (database, module)
添加所有表格内容moduledatabase. module必须包含分析tables列出应添加内容的所有表,以及每个具有实际内容的表的一个属性.

这通常用于安装序列表.

msilib.add_streamdatabase, name, path
将文件path添加到_Streamdatabase表中,使用streamname name.
msilib.gen_uuid
返回一个新的UUID,格式为MSI通常需要的格式(即花括号,大写为所有十六进制).

参见

FCICreateUuidCreateUuidToString

 

数据库对象

Database.OpenViewsql
返回一个视图对象,通过调用MSIDatabaseOpenView(). sql是要执行的SQL语句.
Database.Commit (
通过调用MSIDatabaseCommit().
Database.GetSummaryInformationcount
通过调用MsiGetSummaryInformation(). count是更新值的最大数量.
Database.Close
通过MsiCloseHandle().

版本3.7.

也可以看看

MSIDatabaseOpenViewMSIDatabaseCommitMSIGetSummaryInformationMsiCloseHandle

 

查看对象

View.Executeparams
通过MSIViewExecute()执行视图的SQL查询。如果params不是None,它是描述查询中参数标记的实际值的记录.
View.GetColumnInfokind
通过调用MsiViewGetColumnInfo(). kind可以是MSICOLINFO_NAMES要么MSICOLINFO_TYPES.
View.Fetch
返回查询的结果记录,通过调用MsiViewFetch().
View.Modifykind, data
修改视图,通过调用MsiViewModify(). kind可以是MSIMODIFY_SEEK, MSIMODIFY_REFRESH, MSIMODIFY_INSERT,MSIMODIFY_UPDATE, MSIMODIFY_ASSIGN, MSIMODIFY_REPLACE,MSIMODIFY_MERGE, MSIMODIFY_DELETE, MSIMODIFY_INSERT_TEMPORARY,MSIMODIFY_VALIDATE, MSIMODIFY_VALIDATE_NEW,MSIMODIFY_VALIDATE_FIELD之一,或MSIMODIFY_VALIDATE_DELETE.

data必须是描述新数据的记录.

View.Close
关闭视图,通过MsiViewClose().

参见

MsiViewExecuteMSIViewGetColumnInfoMsiViewFetchMsiViewModifyMsiViewClose

 

摘要信息对象

SummaryInformation.GetPropertyfield
返回摘要的属性,通过MsiSummaryInfoGetProperty().field是属性的名称,可以是常量之一PID_CODEPAGE, PID_TITLE, PID_SUBJECT, PID_AUTHOR,PID_KEYWORDS, PID_COMMENTS, PID_TEMPLATE, PID_LASTAUTHOR,PID_REVNUMBER, PID_LASTPRINTED, PID_CREATE_DTM,PID_LASTSAVE_DTM, PID_PAGECOUNT, PID_WORDCOUNT, PID_CHARCOUNT,PID_APPNAME,或PID_SECURITY.
SummaryInformation.GetPropertyCount
通过MsiSummaryInfoGetPropertyCount().
SummaryInformation.SetPropertyfield, value
通过MsiSummaryInfoSetProperty(). field设置属性可以与GetProperty(), value中的值相同是属性的新值。可能的值类型是整数和字符串.
SummaryInformation.Persist
使用MsiSummaryInfoPersist().

将修改后的属性写入摘要信息流。另请参阅

MsiSummaryInfoGetPropertyMsiSummaryInfoGetPropertyCountMsiSummaryInfoSetPropertyMsiSummaryInfoPersist

 

记录对象

Record.GetFieldCount
通过MsiRecordGetFieldCount().
Record.GetIntegerfield
返回field尽可能为整数。field必须是一个整数.
Record.GetStringfield
返回field尽可能作为字符串。field必须是一个整数.
Record.SetStringfield, value
设置fieldvalue通过MsiRecordSetString(). field必须是整数;value一根绳子
Record.SetStreamfield, value
设置field到名为value,通过MsiRecordSetStream(). field必须是整数;value一根绳子
Record.SetIntegerfield, value
设置fieldvalue通过MsiRecordSetInteger()。两个fieldvalue必须是一个整数.
Record.ClearData ()
把记录的所有字段设置为0,通过MsiRecordClearData().

参见

MsiRecordGetFieldCountMsiRecordSetStringMsiRecordSetStreamMsiRecordSetIntegerMsiRecordClearData

 

错误

MSI函数周围的所有包装器都会引发MSIError;theexception里面的字符串将包含更多的细节.

 

CAB对象

class msilib.CABname
CAB代表一个CAB文件。在MSI构建期间,文件将同时添加到Files表和CAB文件中。然后,添加完所有文件后,可以编写CAB文件,然后添加到MSI文件中.

name是MSI文件中CAB文件的名称.

appendfull, file, logical
将名为full的文件添加到名为logical的CAB文件中。如果已有一个名为logical的文件,则创建一个新文件名.

返回CAB文件中文件的索引,文件的新名称在CAB文件中.

commitdatabase
生成一个CAB文件,将其作为流添加到MSI文件中,将其放入Media表中,然后删除生成的文件来自磁盘.

 

目录对象

class msilib.Directorydatabase, cab, basedir, physical, logical, default [, componentflags]
在Directory表中创建一个新目录。目录中有一个当前组件,可以通过start_component()显式创建,也可以在第一次添加文件时隐式创建。文件被添加到当前组件中,并添加到cab文件中。要创建目录,需要指定基目录对象(可以是None),物理目录的路径和逻辑目录名。default指定目录表中的DefaultDir插槽。componentflags指定新组件得到的默认标志.

start_component (component=None, feature=None, flags=None, keyfile=None, uuid=None)
添加一个组件表的条目,并使该组件成为此组件的当前组件目录。如果未给出组件名称,则使用目录名称。如果没有给出feature,则使用当前功能。如果没有给出flags,则使用目录的默认标志。如果没有给出keyfile,则KeyPath在Component表中保留为空.
add_file (file, src=None, version=None, language=None )
将文件添加到目录的当前组件,如果没有当前组件,则启动新文件。默认情况下,源和文件表中的文件名将相同。如果指定了src文件,则相对于当前目录进行解释。可选地,可以为File表中的条目指定versionlanguage.
glob(pattern, exclude=None)
添加一个globpattern中指定的当前组件的文件列表。单个文件可以排除在exclude列表中
remove_pyc)
删除.pyc卸载文件.

另请参阅

目录TableFile TableComponent TableFeatureComponents表

 

功能

class msilib.Featuredb, id, title, desc, display, level=1, parent=None, directory=None, attributes=0
添加新记录到Feature表,使用值id, parent.id,title, desc, display, level, directoryattributes。得到的特征对象可以传递给start_component() Directory.

set_current)的方法
使这个特征成为msilib的当前特征。新组件区域自动添加到默认功能,除非明确指定功能.

参见

特写表

 

GUI

msilib提供了几个将GUI表包装在MSI数据库中的类。但是,没有提供标准用户界面;使用bdist_msi使用用户界面创建MSI文件以安装Python包.

class msilib.Control (dlg, name)
对话框控件的基类。dlg是控件所属的对话框对象,name是控件的名称.

event (event, argument, condition=1, ordering=None)
进入ControlEvent表进行此控制.
mapping (event, attribute
进入EventMapping表格进行此控制.
condition (action, condition)
进入ControlCondition表格进入该控件.
class msilib.RadioButtonGroup (dlg, name, property)
创建一个名为name. property的单选按钮控件安装程序属性,当选择单选按钮时设置.

add(name, x, y, width, height, text, value=None
将一个名为name的单选按钮添加到组中,坐标为x, y,width, height,标签为text。如果valueNone,那就是name.
class msilib.Dialogdb, name, x, y, w, h, attr, title, first, default, cancel
返回一个新的Dialog宾语。使用指定的坐标,对话框属性,标题,第一个,默认和取消控件的名称,在Dialog表中创建一个条目.

control (name, type, x, y, width, height, attributes, property, text, control_next, help)
返回一个新的Control宾语。中的一个条目Control表格是用指定的参数制作的.

这是一种通用方法;对于特定类型,提供专门的方法.

textname, x, y, width, height, attributes, text
添加并返回Text控制
bitmapname, x, y, width, height, text)
添加并返回Bitmap控制
line// (name, x, y, width, height )
添加并返回Line control.
pushbutton (name, x, y, width, height, attributes, text, next_control)
添加并返回PushButton控制
radiogroupname, x, y, width, height, attributes, property, text, next_control
添加并返回RadioButtonGroup control.
checkbox(name, x, y, width, height, attributes, property, text, next_control)
添加并返回CheckBox控制

也可以看看

Dialog TableControl TableControl TypesControlCondition TableControlEvent TableEventMapping TableRadioButton Table

 

预先计算的表

msilib提供了一些仅包含schema和tabledefinitions的子包。目前,这些定义基于MSI版本2.0.

msilib.schema
这是MSI 2.0的标准MSI架构,tablesvariable提供表定义列表,_Validation_records为MSI验证提供数据.
msilib.sequence
该模块包含标准序列表的表内容:AdminExecuteSequence, AdminUISequence, AdvtExecuteSequence,InstallExecuteSequenceInstallUISequence.
msilib.text
此模块包含UIText和ActionText表的定义,用于标准安装程序操作.

评论被关闭。