| \section{\module{msilib} --- | 
 |          Read and write Microsoft Installer files} | 
 |  | 
 | \declaremodule{standard}{msilib} | 
 |   \platform{Windows} | 
 | \modulesynopsis{Creation of Microsoft Installer files, and CAB files.} | 
 | \moduleauthor{Martin v. L\"owis}{martin@v.loewis.de} | 
 | \sectionauthor{Martin v. L\"owis}{martin@v.loewis.de} | 
 |  | 
 | \index{msi} | 
 |  | 
 | \versionadded{2.5} | 
 |  | 
 | The \module{msilib} supports the creation of Microsoft Installer | 
 | (\code{.msi}) files.  Because these files often contain an embedded | 
 | ``cabinet'' file (\code{.cab}), it also exposes an API to create | 
 | CAB files. Support for reading \code{.cab} files is currently not | 
 | implemented; read support for the \code{.msi} database is possible. | 
 |  | 
 | This package aims to provide complete access to all tables in an | 
 | \code{.msi} file, therefore, it is a fairly low-level API. Two | 
 | primary applications of this package are the \module{distutils} | 
 | command \code{bdist_msi}, and the creation of Python installer | 
 | package itself (although that currently uses a different version | 
 | of \code{msilib}). | 
 |  | 
 | The package contents can be roughly split into four parts: | 
 | low-level CAB routines, low-level MSI routines, higher-level | 
 | MSI routines, and standard table structures. | 
 |  | 
 | \begin{funcdesc}{FCICreate}{cabname, files} | 
 |   Create a new CAB file named \var{cabname}. \var{files} must | 
 |   be a list of tuples, each containing the name of the file on | 
 |   disk, and the name of the file inside the CAB file. | 
 |  | 
 |   The files are added to the CAB file in the order they appear | 
 |   in the list. All files are added into a single CAB file, | 
 |   using the MSZIP compression algorithm. | 
 |  | 
 |   Callbacks to Python for the various steps of MSI creation | 
 |   are currently not exposed. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{UUIDCreate}{} | 
 |   Return the string representation of a new unique identifier. | 
 |   This wraps the Windows API functions \cfunction{UuidCreate} and | 
 |   \cfunction{UuidToString}. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{OpenDatabase}{path, persist} | 
 |   Return a new database object by calling MsiOpenDatabase.   | 
 |   \var{path} is the file name of the | 
 |   MSI file; \var{persist} can be one of the constants  | 
 |   \code{MSIDBOPEN_CREATEDIRECT}, \code{MSIDBOPEN_CREATE}, | 
 |   \code{MSIDBOPEN_DIRECT}, \code{MSIDBOPEN_READONLY}, or | 
 |   \code{MSIDBOPEN_TRANSACT}, and may include the flag | 
 |   \code{MSIDBOPEN_PATCHFILE}. See the Microsoft documentation for | 
 |   the meaning of these flags; depending on the flags, | 
 |   an existing database is opened, or a new one created. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{CreateRecord}{count} | 
 |   Return a new record object by calling \cfunction{MSICreateRecord}. | 
 |   \var{count} is the number of fields of the record. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{init_database}{name, schema, ProductName, ProductCode, ProductVersion, Manufacturer} | 
 |   Create and return a new database \var{name}, initialize it  | 
 |   with \var{schema},  and set the properties \var{ProductName}, | 
 |   \var{ProductCode}, \var{ProductVersion}, and \var{Manufacturer}. | 
 |  | 
 |   \var{schema} must be a module object containing \code{tables} and | 
 |   \code{_Validation_records} attributes; typically, | 
 |   \module{msilib.schema} should be used. | 
 |  | 
 |   The database will contain just the schema and the validation | 
 |   records when this function returns. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{add_data}{database, records} | 
 |   Add all \var{records} to \var{database}.  \var{records} should | 
 |   be a list of tuples, each one containing all fields of a record | 
 |   according to the schema of the table.  For optional fields, | 
 |   \code{None} can be passed. | 
 |  | 
 |   Field values can be int or long numbers, strings, or instances | 
 |   of the Binary class. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{classdesc}{Binary}{filename} | 
 |   Represents entries in the Binary table; inserting such | 
 |   an object using \function{add_data} reads the file named | 
 |   \var{filename} into the table. | 
 | \end{classdesc} | 
 |  | 
 | \begin{funcdesc}{add_tables}{database, module} | 
 |   Add all table content from \var{module} to \var{database}. | 
 |   \var{module} must contain an attribute \var{tables} | 
 |   listing all tables for which content should be added, | 
 |   and one attribute per table that has the actual content. | 
 |  | 
 |   This is typically used to install the sequence tables. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{add_stream}{database, name, path} | 
 |   Add the file \var{path} into the \code{_Stream} table | 
 |   of \var{database}, with the stream name \var{name}. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{gen_uuid}{} | 
 |   Return a new UUID, in the format that MSI typically | 
 |   requires (i.e. in curly braces, and with all hexdigits | 
 |   in upper-case). | 
 | \end{funcdesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devnotes/winprog/fcicreate.asp]{FCICreateFile}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidcreate.asp]{UuidCreate}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidtostring.asp]{UuidToString}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{Database Objects\label{database-objects}} | 
 |  | 
 | \begin{methoddesc}{OpenView}{sql} | 
 |   Return a view object, by calling \cfunction{MSIDatabaseOpenView}. | 
 |   \var{sql} is the SQL statement to execute. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{Commit}{} | 
 |   Commit the changes pending in the current transaction, | 
 |   by calling \cfunction{MSIDatabaseCommit}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{GetSummaryInformation}{count} | 
 |   Return a new summary information object, by calling | 
 |   \cfunction{MsiGetSummaryInformation}.  \var{count} is the maximum number of | 
 |   updated values. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiopenview.asp]{MSIOpenView}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msidatabasecommit.asp]{MSIDatabaseCommit}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msigetsummaryinformation.asp]{MSIGetSummaryInformation}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{View Objects\label{view-objects}} | 
 |  | 
 | \begin{methoddesc}{Execute}{\optional{params=None}} | 
 |   Execute the SQL query of the view, through \cfunction{MSIViewExecute}. | 
 |   \var{params} is an optional record describing actual values | 
 |   of the parameter tokens in the query. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{GetColumnInfo}{kind} | 
 |   Return a record describing the columns of the view, through | 
 |   calling \cfunction{MsiViewGetColumnInfo}. \var{kind} can be either | 
 |   \code{MSICOLINFO_NAMES} or \code{MSICOLINFO_TYPES}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{Fetch}{} | 
 |   Return a result record of the query, through calling | 
 |   \cfunction{MsiViewFetch}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{Modify}{kind, data} | 
 |   Modify the view, by calling \cfunction{MsiViewModify}. \var{kind} | 
 |   can be one of  \code{MSIMODIFY_SEEK}, \code{MSIMODIFY_REFRESH}, | 
 |   \code{MSIMODIFY_INSERT}, \code{MSIMODIFY_UPDATE}, \code{MSIMODIFY_ASSIGN}, | 
 |   \code{MSIMODIFY_REPLACE}, \code{MSIMODIFY_MERGE}, \code{MSIMODIFY_DELETE}, | 
 |   \code{MSIMODIFY_INSERT_TEMPORARY}, \code{MSIMODIFY_VALIDATE}, | 
 |   \code{MSIMODIFY_VALIDATE_NEW}, \code{MSIMODIFY_VALIDATE_FIELD}, or | 
 |   \code{MSIMODIFY_VALIDATE_DELETE}. | 
 |  | 
 |   \var{data} must be a record describing the new data. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{Close}{} | 
 |   Close the view, through \cfunction{MsiViewClose}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewexecute.asp]{MsiViewExecute}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewgetcolumninfo.asp]{MSIViewGetColumnInfo}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewfetch.asp]{MsiViewFetch}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewmodify.asp]{MsiViewModify}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewclose.asp]{MsiViewClose}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{Summary Information Objects\label{summary-objects}} | 
 |  | 
 | \begin{methoddesc}{GetProperty}{field} | 
 |   Return a property of the summary, through \cfunction{MsiSummaryInfoGetProperty}. | 
 |   \var{field} is the name of the property, and can be one of the | 
 |   constants | 
 |   \code{PID_CODEPAGE}, \code{PID_TITLE}, \code{PID_SUBJECT}, | 
 |   \code{PID_AUTHOR}, \code{PID_KEYWORDS}, \code{PID_COMMENTS}, | 
 |   \code{PID_TEMPLATE}, \code{PID_LASTAUTHOR}, \code{PID_REVNUMBER}, | 
 |   \code{PID_LASTPRINTED}, \code{PID_CREATE_DTM}, \code{PID_LASTSAVE_DTM}, | 
 |   \code{PID_PAGECOUNT}, \code{PID_WORDCOUNT}, \code{PID_CHARCOUNT}, | 
 |   \code{PID_APPNAME}, or \code{PID_SECURITY}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{GetPropertyCount}{} | 
 |   Return the number of summary properties, through | 
 |   \cfunction{MsiSummaryInfoGetPropertyCount}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{SetProperty}{field, value} | 
 |   Set a property through \cfunction{MsiSummaryInfoSetProperty}. \var{field} | 
 |   can have the same values as in \method{GetProperty}, \var{value} | 
 |   is the new value of the property. Possible value types are integer | 
 |   and string. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{Persist}{} | 
 |   Write the modified properties to the summary information stream, | 
 |   using \cfunction{MsiSummaryInfoPersist}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfogetproperty.asp]{MsiSummaryInfoGetProperty}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfogetpropertycount.asp]{MsiSummaryInfoGetPropertyCount}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfosetproperty.asp]{MsiSummaryInfoSetProperty}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfopersist.asp]{MsiSummaryInfoPersist}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{Record Objects\label{record-objects}} | 
 |  | 
 | \begin{methoddesc}{GetFieldCount}{} | 
 |   Return the number of fields of the record, through \cfunction{MsiRecordGetFieldCount}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{SetString}{field, value} | 
 |   Set \var{field} to \var{value} through \cfunction{MsiRecordSetString}. | 
 |   \var{field} must be an integer; \var{value} a string. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{SetStream}{field, value} | 
 |   Set \var{field} to the contents of the file named \var{value}, | 
 |   through \cfunction{MsiRecordSetStream}. | 
 |   \var{field} must be an integer; \var{value} a string. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{SetInteger}{field, value} | 
 |   Set \var{field} to \var{value} through \cfunction{MsiRecordSetInteger}. | 
 |   Both \var{field} and \var{value} must be an integer. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{ClearData}{} | 
 |   Set all fields of the record to 0, through \cfunction{MsiRecordClearData}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordgetfieldcount.asp]{MsiRecordGetFieldCount}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordsetstring.asp]{MsiRecordSetString}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordsetstream.asp]{MsiRecordSetStream}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordsetinteger.asp]{MsiRecordSetInteger}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordclear.asp]{MsiRecordClear}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{Errors\label{msi-errors}} | 
 |  | 
 | All wrappers around MSI functions raise \exception{MsiError}; | 
 | the string inside the exception will contain more detail. | 
 |  | 
 | \subsection{CAB Objects\label{cab}} | 
 |  | 
 | \begin{classdesc}{CAB}{name} | 
 |   The class \class{CAB} represents a CAB file. During MSI construction, | 
 |   files will be added simultaneously to the \code{Files} table, and | 
 |   to a CAB file. Then, when all files have been added, the CAB file | 
 |   can be written, then added to the MSI file. | 
 |  | 
 |   \var{name} is the name of the CAB file in the MSI file. | 
 | \end{classdesc} | 
 |  | 
 | \begin{methoddesc}[CAB]{append}{full, logical} | 
 |   Add the file with the pathname \var{full} to the CAB file, | 
 |   under the name \var{logical}. If there is already a file | 
 |   named \var{logical}, a new file name is created. | 
 |  | 
 |   Return the index of the file in the CAB file, and the | 
 |   new name of the file inside the CAB file. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CAB]{append}{database} | 
 |   Generate a CAB file, add it as a stream to the MSI file, | 
 |   put it into the \code{Media} table, and remove the generated | 
 |   file from the disk. | 
 | \end{methoddesc} | 
 |  | 
 | \subsection{Directory Objects\label{msi-directory}} | 
 |  | 
 | \begin{classdesc}{Directory}{database, cab, basedir, physical,  | 
 |                   logical, default, component, \optional{componentflags}} | 
 |   Create a new directory in the Directory table. There is a current | 
 |   component at each point in time for the directory, which is either | 
 |   explicitly created through \method{start_component}, or implicitly when files | 
 |   are added for the first time. Files are added into the current | 
 |   component, and into the cab file.  To create a directory, a base | 
 |   directory object needs to be specified (can be \code{None}), the path to | 
 |   the physical directory, and a logical directory name.  \var{default} | 
 |   specifies the DefaultDir slot in the directory table. \var{componentflags} | 
 |   specifies the default flags that new components get. | 
 | \end{classdesc} | 
 |  | 
 | \begin{methoddesc}[Directory]{start_component}{\optional{component\optional{, | 
 |       feature\optional{, flags\optional{, keyfile\optional{, uuid}}}}}} | 
 |   Add an entry to the Component table, and make this component the | 
 |   current component for this directory. If no component name is given, the | 
 |   directory name is used. If no \var{feature} is given, the current feature | 
 |   is used. If no \var{flags} are given, the directory's default flags are | 
 |   used. If no \var{keyfile} is given, the KeyPath is left null in the | 
 |   Component table. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Directory]{add_file}{file\optional{, src\optional{, | 
 |       version\optional{, language}}}} | 
 |   Add a file to the current component of the directory, starting a new | 
 |   one if there is no current component. By default, the file name | 
 |   in the source and the file table will be identical. If the \var{src} file | 
 |   is specified, it is interpreted relative to the current | 
 |   directory. Optionally, a \var{version} and a \var{language} can be specified for | 
 |   the entry in the File table. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Directory]{glob}{pattern\optional{, exclude}} | 
 |   Add a list of files to the current component as specified in the glob | 
 |   pattern. Individual files can be excluded in the \var{exclude} list. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Directory]{remove_pyc}{} | 
 |   Remove \code{.pyc}/\code{.pyo} files on uninstall. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/directory_table.asp]{Directory Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/file_table.asp]{File Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/component_table.asp]{Component Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/featurecomponents_table.asp]{FeatureComponents Table}{} | 
 | \end{seealso} | 
 |  | 
 |  | 
 | \subsection{Features\label{features}} | 
 |  | 
 | \begin{classdesc}{Feature}{database, id, title, desc, display\optional{, | 
 |     level=1\optional{, parent\optional\{, directory\optional{,  | 
 |     attributes=0}}}} | 
 |  | 
 |   Add a new record to the \code{Feature} table, using the values | 
 |   \var{id}, \var{parent.id}, \var{title}, \var{desc}, \var{display}, | 
 |   \var{level}, \var{directory}, and \var{attributes}. The resulting | 
 |   feature object can be passed to the \method{start_component} method | 
 |   of \class{Directory}. | 
 | \end{classdesc} | 
 |  | 
 | \begin{methoddesc}[Feature]{set_current}{} | 
 |   Make this feature the current feature of \module{msilib}. | 
 |   New components are automatically added to the default feature, | 
 |   unless a feature is explicitly specified. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/feature_table.asp]{Feature Table}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{GUI classes\label{msi-gui}} | 
 |  | 
 | \module{msilib} provides several classes that wrap the GUI tables in | 
 | an MSI database. However, no standard user interface is provided; use | 
 | \module{bdist_msi} to create MSI files with a user-interface for | 
 | installing Python packages. | 
 |  | 
 | \begin{classdesc}{Control}{dlg, name} | 
 |   Base class of the dialog controls. \var{dlg} is the dialog object | 
 |   the control belongs to, and \var{name} is the control's name. | 
 | \end{classdesc} | 
 |  | 
 | \begin{methoddesc}[Control]{event}{event, argument\optional{,  | 
 |    condition = ``1''\optional{, ordering}}} | 
 |  | 
 |   Make an entry into the \code{ControlEvent} table for this control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Control]{mapping}{event, attribute} | 
 |   Make an entry into the \code{EventMapping} table for this control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Control]{condition}{action, condition} | 
 |   Make an entry into the \code{ControlCondition} table for this control. | 
 | \end{methoddesc} | 
 |  | 
 |  | 
 | \begin{classdesc}{RadioButtonGroup}{dlg, name, property} | 
 |   Create a radio button control named \var{name}. \var{property} | 
 |   is the installer property that gets set when a radio button | 
 |   is selected. | 
 | \end{classdesc} | 
 |  | 
 | \begin{methoddesc}[RadioButtonGroup]{add}{name, x, y, width, height, text | 
 |                                           \optional{, value}} | 
 |   Add a radio button named \var{name} to the group, at the | 
 |   coordinates \var{x}, \var{y}, \var{width}, \var{height}, and | 
 |   with the label \var{text}. If \var{value} is omitted, it | 
 |   defaults to \var{name}. | 
 | \end{methoddesc} | 
 |             | 
 | \begin{classdesc}{Dialog}{db, name, x, y, w, h, attr, title, first,  | 
 |     default, cancel} | 
 |   Return a new \class{Dialog} object. An entry in the \code{Dialog} table | 
 |   is made, with the specified coordinates, dialog attributes, title, | 
 |   name of the first, default, and cancel controls. | 
 | \end{classdesc} | 
 |  | 
 | \begin{methoddesc}[Dialog]{control}{name, type, x, y, width, height,  | 
 |                   attributes, property, text, control_next, help} | 
 |   Return a new \class{Control} object. An entry in the \code{Control} table | 
 |   is made with the specified parameters. | 
 |  | 
 |   This is a generic method; for specific types, specialized methods | 
 |   are provided. | 
 | \end{methoddesc} | 
 |  | 
 |  | 
 | \begin{methoddesc}[Dialog]{text}{name, x, y, width, height, attributes, text} | 
 |   Add and return a \code{Text} control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Dialog]{bitmap}{name, x, y, width, height, text} | 
 |   Add and return a \code{Bitmap} control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Dialog]{line}{name, x, y, width, height} | 
 |   Add and return a \code{Line} control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Dialog]{pushbutton}{name, x, y, width, height, attributes,  | 
 |                                  text, next_control} | 
 |   Add and return a \code{PushButton} control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Dialog]{radiogroup}{name, x, y, width, height,  | 
 |                                  attributes, property, text, next_control} | 
 |   Add and return a \code{RadioButtonGroup} control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[Dialog]{checkbox}{name, x, y, width, height,  | 
 |                                  attributes, property, text, next_control} | 
 |   Add and return a \code{CheckBox} control. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{seealso} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/dialog_table.asp]{Dialog Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/control_table.asp]{Control Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/controls.asp]{Control Types}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/controlcondition_table.asp]{ControlCondition Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/controlevent_table.asp]{ControlEvent Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/eventmapping_table.asp]{EventMapping Table}{} | 
 |   \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/radiobutton_table.asp]{RadioButton Table}{} | 
 | \end{seealso} | 
 |  | 
 | \subsection{Precomputed tables\label{msi-tables}} | 
 |  | 
 | \module{msilib} provides a few subpackages that contain | 
 | only schema and table definitions. Currently, these definitions | 
 | are based on MSI version 2.0. | 
 |  | 
 | \begin{datadesc}{schema} | 
 |   This is the standard MSI schema for MSI 2.0, with the | 
 |   \var{tables} variable providing a list of table definitions, | 
 |   and \var{_Validation_records} providing the data for | 
 |   MSI validation. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{sequence} | 
 |   This module contains table contents for the standard sequence | 
 |   tables: \var{AdminExecuteSequence}, \var{AdminUISequence}, | 
 |   \var{AdvtExecuteSequence}, \var{InstallExecuteSequence}, and | 
 |   \var{InstallUISequence}. | 
 | \end{datadesc} | 
 |  | 
 | \begin{datadesc}{text} | 
 |   This module contains definitions for the UIText and ActionText | 
 |   tables, for the standard installer actions. | 
 | \end{datadesc} |