diff --git a/WindowsInstaller/Tutorial/CustomAction/CustomAction.config b/WindowsInstaller/Tutorial/CustomAction/CustomAction.config
new file mode 100644
index 000000000..c837a2cee
--- /dev/null
+++ b/WindowsInstaller/Tutorial/CustomAction/CustomAction.config
@@ -0,0 +1,32 @@
+
+
+ Set this value for all components belonging to a feature to prevent the feature from being run-from-network or
+ run-from-source. Note that if a feature has no components, the feature always shows run-from-source and
+ run-from-my-computer as valid options.
+
+ Set this bit for all components belonging to a feature to prevent the feature from being run-from-my-computer.
+ Note that if a feature has no components, the feature always shows run-from-source and run-from-my-computer
+ as valid options.
+
+ If the Value field of the corresponding record in the Registry table is null, the Name field in that record
+ must not contain "+", "-", or "*". For more information, see the description of the Name field in Registry
+ table.
+ Setting this bit is recommended for registry entries written to the HKCU hive. This ensures the installer
+ writes the necessary HKCU registry entries when there are multiple users on the same machine.
+ Use this flag only for components that are being registered by the Registry table. Do not use this flag for + components registered by the AppId, Class, Extension, ProgId, MIME, and Verb tables. +
+ If this is a 64-bit component replacing a 32-bit component, set this bit and assign a new GUID in the + ComponentId column. +
+ If this bit is set, the Windows Installer calls the RegDisableReflectionKey on each key being accessed by the component. + This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems. +
+ If a subsequent patch is installed, marked with the SupersedeEarlier flag in its MsiPatchSequence + table to supersede the first patch, Windows Installer 4.5 can unregister and uninstall components marked with the + UninstallOnSupersedence value. If the component is not marked with this bit, installation of a superseding patch can leave + behind an unused component on the computer. +
+ A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource,
+ is installed locally. Components marked
+ A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource,
+ is installed to run locally. Components marked
+ Omit this attribute and the feature state is determined according to DisallowAdvertise and + FavorLocal and FavorSource. +
To guarantee that the child feature's state always follows the state of its parent, even when the + child and parent are initially set to absent in the SelectionTree control, you must include both + FollowParent and UIDisallowAbsent in the attributes of the child feature.
+Note that if you set FollowParent without setting UIDisallowAbsent, the installer cannot force + the child feature out of the absent state. In this case, the child feature matches the parent's + installation state only if the child is set to something other than absent.
+Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.
++ If the feature is listed by the ADDDEFAULT property this bit is ignored and the feature state is determined + according to FavorLocal and FavorSource. +
Omit this attribute and the feature state is determined according to DisallowAdvertise and FavorLocal + and FavorSource.
++ Note that this bit works only with features that are listed by the ADVERTISE property. +
Set this attribute and if the listed feature is not a parent or child, the feature is installed according to + FavorLocal and FavorSource.
+Set this attribute for the parent of a listed feature and the parent is installed.
+Set this attribute for the child of a listed feature and the state of the child is Absent.
+Omit this attribute and if the listed feature is not a parent or child, the feature state is Advertise.
+Omit this attribute and if the listed feature is a parent or child, the state of both features is Advertise.
++ Omit this attribute and the user interface displays an option to change the feature state to Absent. +
Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.
+Setting this attribute not only affects the UI, but also forces the feature to the install state whether + the feature is visible in the UI or not.
+
+ Examples:
+
+
+
+
+
+
+ Win32 MSI API: + MsiGetComponentState +
+ Win32 MSI APIs: + MsiGetComponentState, + MsiSetComponentState +
+ Win32 MSI API: + MsiEnumComponentCosts +
+ Win32 MSI API: + MsiEnumComponents +
+ Win32 MSI API: + MsiEnumComponentsEx +
+ Win32 MSI API: + MsiGetProductCode +
+ Because clients are not ordered, any new component has an arbitrary index. + This means that the property may return clients in any order. +
+ Win32 MSI API: + MsiEnumClients, + MsiEnumClientsEx +
+ Win32 MSI API: + MsiGetComponentPath, + MsiGetComponentPathEx +
+ If the component is a registry key, the registry roots are represented numerically. + For example, a registry path of "HKEY_CURRENT_USER\SOFTWARE\Microsoft" would be returned + as "01:\SOFTWARE\Microsoft". The registry roots returned are defined as follows: + HKEY_CLASSES_ROOT=00, HKEY_CURRENT_USER=01, HKEY_LOCAL_MACHINE=02, HKEY_USERS=03, + HKEY_PERFORMANCE_DATA=04 +
+ Win32 MSI APIs: + MsiGetComponentPath, + MsiGetComponentPathEx, + MsiLocateComponent +
+ Because qualifiers are not ordered, any new qualifier has an arbitrary index, + meaning the function can return qualifiers in any order. +
+ Win32 MSI API: + MsiEnumComponentQualifiers +
+ Win32 MSI API: + MsiEnumComponentQualifiers +
+ A custom action method must be defined as public and static,
+ take a single
+ The
+ The client can use the following procedure for data access:
+
+
+ Because this constructor initiates database access, it cannot be used with a + running installation. +
+ The Database object should be
+ Win32 MSI API: + MsiOpenDatabase +
+ When a database is opened as the output of another database, the summary information stream + of the output database is actually a read-only mirror of the original database and thus cannot + be changed. Additionally, it is not persisted with the database. To create or modify the + summary information for the output database it must be closed and re-opened. +
+ The Database object should be
+ The database is opened in
+ Win32 MSI API: + MsiOpenDatabase +
+ Because this constructor initiates database access, it cannot be used with a + running installation. +
+ The database object should be
+ A database opened in
+ Win32 MSI API: + MsiOpenDatabase +
+ Win32 MSI API: + MsiGetDatabaseState +
+ Getting or setting the code page is a slow operation because it involves an export or import + of the codepage data to/from a temporary file. +
+ The object returned from this property does not need to be explicitly persisted or closed. + Any modifications will be automatically saved when the database is committed. +
+ Win32 MSI API: + MsiGetSummaryInformation +
+ This method is only provided for interop purposes. A Database object
+ should normally be obtained from
+ Once an item is scheduled, it cannot be unscheduled. +
+ The items cannot be deleted if the Database object is auto-disposed by the + garbage collector; the handle must be explicitly closed. +
+ Files which are read-only or otherwise locked cannot be deleted, + but they will not cause an exception to be thrown. +
+ Merge does not copy over embedded cabinet files or embedded transforms from the + reference database into the target database. Embedded data streams that are listed in the + Binary table or Icon table are copied from the reference database to the target database. + Storage embedded in the reference database are not copied to the target database. +
+ The Merge method merges the data of two databases. These databases must have the same + codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists + if the data in any row in the first database differs from the data in the corresponding row + of the second database. Corresponding rows are in the same table of both databases and have + the same primary key in both databases. The tables of non-conflicting databases must have + the same number of primary keys, same number of columns, same column types, same column names, + and the same data in rows with identical primary keys. Temporary columns however don't matter + in the column count and corresponding tables can have a different number of temporary columns + without creating conflict as long as the persistent columns match. +
+ If the number, type, or name of columns in corresponding tables are different, the + schema of the two databases are incompatible and the installer will stop processing tables + and the merge fails. The installer checks that the two databases have the same schema before + checking for row merge conflicts. If the schemas are incompatible, the databases have be + modified. +
+ If the data in particular rows differ, this is a row merge conflict, the merge fails + and creates a new table with the specified name. The first column of this table is the name + of the table having the conflict. The second column gives the number of rows in the table + having the conflict. +
+ Win32 MSI API: + MsiDatabaseMerge +
+ MsiDatabaseMerge does not copy over embedded cabinet files or embedded transforms from + the reference database into the target database. Embedded data streams that are listed in + the Binary table or Icon table are copied from the reference database to the target database. + Storage embedded in the reference database are not copied to the target database. +
+ The Merge method merges the data of two databases. These databases must have the same + codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists + if the data in any row in the first database differs from the data in the corresponding row + of the second database. Corresponding rows are in the same table of both databases and have + the same primary key in both databases. The tables of non-conflicting databases must have + the same number of primary keys, same number of columns, same column types, same column names, + and the same data in rows with identical primary keys. Temporary columns however don't matter + in the column count and corresponding tables can have a different number of temporary columns + without creating conflict as long as the persistent columns match. +
+ If the number, type, or name of columns in corresponding tables are different, the + schema of the two databases are incompatible and the installer will stop processing tables + and the merge fails. The installer checks that the two databases have the same schema before + checking for row merge conflicts. If the schemas are incompatible, the databases have be + modified. +
+ Win32 MSI API: + MsiDatabaseMerge +
+ To check whether a table exists regardless of persistence,
+ use
+ Win32 MSI API: + MsiDatabaseIsTablePersistent +
+ To check whether a column exists regardless of persistence,
+ use
+ For a database open in
+ For a database open in
+ For a database open in
+ Win32 MSI API: + MsiDatabaseCommit +
+ Win32 MSI API: + MsiDatabaseExport +
+ Win32 MSI API: + MsiDatabaseImport +
+ The directory will be created if it does not already exist. +
+ Win32 MSI API: + MsiDatabaseExport +
+ Win32 MSI API: + MsiDatabaseImport +
+ This method is equivalent to directly calling the
+ The Record object should be
+ Win32 MSI API: + MsiCreateRecord +
+ The
+ The View object should be
+ Win32 MSI API: + MsiDatabaseOpenView +
+ The
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute +
+ The
+ Multiple rows columns will be collapsed into a single one-dimensional list. +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ Multiple rows columns will be collapsed into a single one-dimensional list. +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ The
+ Multiple rows columns will be collapsed into a single one-dimensional list. +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ Multiple rows columns will be collapsed into a single one-dimensional list. +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ The
+ Multiple rows columns will be collapsed into a single on-dimensional list. +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ Multiple rows columns will be collapsed into a single on-dimensional list. +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ The
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +
+ A transform can add non-primary key columns to the end of a table. A transform cannot + be created that adds primary key columns to a table. A transform cannot be created that + changes the order, names, or definitions of columns. +
+ If the transform is to be applied during an installation you must use the
+
+ Win32 MSI API: + MsiDatabaseGenerateTransform +
+ Win32 MSI API: + MsiCreateTransformSummaryInfo +
+ Win32 MSI API: + MsiDatabaseApplyTransform +
+ Win32 MSI API: + MsiDatabaseApplyTransform +
+ Win32 MSI API: + MsiDatabaseApplyTransform +
+ If the record is passed to
+ The following methods and properties may report extended error data:
+
+
+
+ The Record object should be
+ Win32 MSI API: + MsiGetLastErrorRecord +
+ To restore the previous UI handler, a second call is made to SetExternalUI using the
+ ExternalUIHandler returned by the first call to SetExternalUI and specifying
+
+ The external user interface handler does not have full control over the external user
+ interface unless
+ SetExternalUI should only be called from a bootstrapping application. You cannot call + it from a custom action +
+ Win32 MSI API: + MsiSetExternalUI +
+ To restore the previous UI handler, a second call is made to SetExternalUI using the
+ ExternalUIHandler returned by the first call to SetExternalUI and specifying
+
+ The external user interface handler does not have full control over the external user
+ interface unless
+ SetExternalUI should only be called from a bootstrapping application. You cannot call + it from a custom action +
+ Win32 MSI API: + MsiSetExternalUIRecord +
+ Win32 MSI API: + MsiSetInternalUI +
+ Win32 MSI API: + MsiSetInternalUI +
+ This method takes effect on any new installation processes. Calling this + method from within a custom action will not start logging for that installation. +
+ Win32 MSI API: + MsiEnableLog +
+ The UseFeature method should only be used on features known to be published. The application + should determine the status of the feature by calling either the FeatureState method or + Features method. +
+ Win32 MSI APIs: + MsiUseFeature, + MsiUseFeatureEx +
+ Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a + custom action because the active installation is the only session allowed. +
+ A "safe" Session object ignores the current computer state when opening the package and prevents + changes to the current computer state. +
+ The Session object should be
+ Win32 MSI APIs: + MsiOpenPackage, + MsiOpenPackageEx +
+ Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a + custom action because the active installation is the only session allowed. +
+ A "safe" Session object ignores the current computer state when opening the package and prevents + changes to the current computer state. +
+ The Session object should be
+ Win32 MSI APIs: + MsiOpenPackage, + MsiOpenPackageEx +
+ Note that only one Session object can be opened by a single process. OpenProduct cannot be + used in a custom action because the active installation is the only session allowed. +
+ The Session object should be
+ Win32 MSI API: + MsiOpenProduct +
+ Win32 MSI API: + MsiProvideComponent +
+ Win32 MSI APIs: + MsiProvideQualifiedComponent + MsiProvideQualifiedComponentEx +
+ Win32 MSI API: + MsiProvideAssembly +
+ Win32 MSI API: + MsiInstallMissingComponent +
+ Win32 MSI API: + MsiInstallMissingFile +
+ Win32 MSI API: + MsiReinstallFeature +
+ Win32 MSI API: + MsiReinstallProduct +
+ To completely remove a product, set REMOVE=ALL in
+ This method displays the user interface with the current settings and
+ log mode. You can change user interface settings with the
+ The
+ Win32 MSI API: + MsiInstallProduct +
+ This method displays the user interface with the current settings and
+ log mode. You can change user interface settings with the
+ The
+ Win32 MSI APIs: + MsiConfigureProduct, + MsiConfigureProductEx +
+ The
+ Win32 MSI API: + MsiConfigureFeature +
+ The
+ Win32 MSI API: + MsiApplyPatch +
+ The
+ Win32 MSI API: + MsiApplyPatch +
+ The
+ Win32 MSI API: + MsiRemovePatches +
+ If an item in
+ As this overload uses InstallContext.None, it does not consider the current state of + the system. +
+ Win32 MSI API: + MsiDetermineApplicablePatches +
+ If an item in
+ Passing an InstallContext of None only analyzes the MSI file; it does not consider the + current state of the system. You cannot use InstallContext.None with a ProductCode GUID. +
+ Win32 MSI APIs: + MsiDetermineApplicablePatches + MsiDeterminePatchSequence +
+ Win32 MSI API: + MsiApplyMultiplePatches +
+ Win32 MSI API: + MsiExtractPatchXMLData +
+ Win32 MSI API: + MsiNotifySidChange +
+ Win32 MSI APIs: + MsiAdvertiseProduct, + MsiAdvertiseProductEx +
+ Win32 MSI APIs: + MsiAdvertiseProduct, + MsiAdvertiseProductEx +
+ Win32 MSI APIs: + MsiAdvertiseProduct, + MsiAdvertiseProductEx +
+ The process calling this function must be running under the LocalSystem account. To advertise an + application for per-user installation to a targeted user, the thread that calls this function must + impersonate the targeted user. If the thread calling this function is not impersonating a targeted + user, the application is advertised to all users for installation with elevated privileges. +
+ The process calling this function must be running under the LocalSystem account. To advertise an + application for per-user installation to a targeted user, the thread that calls this function must + impersonate the targeted user. If the thread calling this function is not impersonating a targeted + user, the application is advertised to all users for installation with elevated privileges. +
+ Win32 MSI API: + MsiProcessAdvertiseScript +
+ Only the following properties will be filled in in the returned object:
+ Win32 MSI API: + MsiGetProductInfoFromScript +
+ The returned string may have tokens such as [2] and [3] that are meant to be substituted + with context-specific values. +
+ Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +
+ The returned string may have tokens such as [2] and [3] that are meant to be substituted + with context-specific values. +
+ Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +
+ Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +
+ Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +
+ Win32 MSI API: + MsiGetFileVersion +
+ Win32 MSI API: + MsiGetFileVersion +
+ Win32 MSI API: + MsiGetFileHash +
+ Win32 MSI API: + MsiGetShortcutTarget +
+ Win32 MSI API: + MsiVerifyPackage +
+ Win32 MSI API: + MsiGetPatchFileList +
+ Win32 MSI API: + MsiGetFeatureState +
+ When changing the feature action, the action state of all the Components linked to the changed + Feature records are also updated appropriately, based on the new feature Select state. + All Features can be configured at once by specifying the keyword ALL instead of a specific feature name. +
+ Win32 MSI APIs: + MsiGetFeatureState, + MsiSetFeatureState +
+ Win32 MSI API: + MsiGetFeatureValidStates +
+ Win32 MSI APIs: + MsiGetFeatureInfo, + MsiSetFeatureAttributes +
+ Since the lpAttributes paramter of
+ MsiGetFeatureInfo
+ does not contain an equivalent flag for
+ Since the dwAttributes parameter of
+ MsiSetFeatureAttributes
+ does not contain an equivalent flag for
+ Win32 MSI API: + MsiGetFeatureInfo +
+ Win32 MSI API: + MsiGetFeatureInfo +
+ Win32 MSI API: + MsiGetFeatureCost +
+ Win32 MSI API: + MsiQueryFeatureState +
+ If no usage metrics are recorded, the
+ Win32 MSI API: + MsiGetFeatureUsage +
+ These classes implement the
+ The finalizer of this class will NOT close the handle if it is still open, + because finalization can run on a separate thread from the application, + resulting in potential problems if handles are closed from that thread. + It is best that the handle be closed manually as soon as it is no longer needed, + as leaving lots of unused handles open can degrade performance. +
+ Win32 MSI API: + MsiCloseHandle +
+ The finalizer of this class will NOT close the handle if it is still open, + because finalization can run on a separate thread from the application, + resulting in potential problems if handles are closed from that thread. + It is best that the handle be closed manually as soon as it is no longer needed, + as leaving lots of unused handles open can degrade performance. +
+ This method is merely an alias for the
+ Win32 MSI API: + MsiCloseHandle +
+ The hash code is derived from the native integer handle. +
+ Win32 MSI API: + InitializeEmbeddedUI +
+ Win32 MSI API: + EmbeddedUIHandler +
+ Win32 MSI API: + ShutdownEmbeddedUI +
+ This temporary space requirement is space needed only for the duration + of the installation, over the final footprint on disk. +
+ If
+ The
+ Win32 MSI APIs: + MsiBeginTransaction + MsiJoinTransaction + MsiEndTransaction +
+ Win32 MSI API: + MsiBeginTransaction +
+ Win32 MSI API: + MsiJoinTransaction +
+ Runs any Commit Custom Actions and commits to the system any changes to Win32 or common language + runtime assemblies. Deletes the rollback script, and after using this option, the transaction's + changes can no longer be undone with a Rollback Installation. +
+ This method can only be called by the current owner of the transaction. +
+ Win32 MSI API: + MsiEndTransaction +
+ This method can only be called by the current owner of the transaction. +
+ Win32 MSI API: + MsiEndTransaction +
+ Win32 MSI API: + MsiEnumPatches +
+ Win32 MSI APIs: + MsiEnumPatchesEx +
+ All available user contexts will be queried. +
+ If the
+ This value may not be available for per-user, non-managed applications + if the user is not logged on. +
+ Even if this property is true, the installer can still block the + uninstallation if this patch is required by another patch that + cannot be uninstalled. +
+ Win32 MSI APIs: + MsiGetPatchInfo, + MsiGetPatchInfoEx +
+ Win32 MSI API: + MsiEnumRelatedProducts +
+ Win32 MSI API: + MsiEnumProducts, +
+ Win32 MSI API: + MsiEnumProductsEx +
+ All available user contexts will be queried. +
+ Because features are not ordered, any new feature has an arbitrary index, meaning + this property can return features in any order. +
+ Win32 MSI API: + MsiEnumFeatures +
+ Note that this property does not take into account policies such as AlwaysInstallElevated, + but verifies that the local system owns the product's registry data. +
+ For more information, see + ProductID +
+ Win32 MSI APIs: + MsiGetProductInfo, + MsiGetProductInfoEx +
+ Win32 MSI APIs: + MsiQueryFeatureState, + MsiQueryFeatureStateEx +
+ Win32 MSI API: + MsiQueryComponentState +
+ This method is typically called by an application during the first run of the application. The application
+ first gets the
+ The CollectUserInfo method invokes a FirstRun dialog from the product installation database. +
+ Win32 MSI API: + MsiCollectUserInfo +
+ Most methods on the Record class have overloads that allow using either a number + or a name to designate a field. However note that field names only exist when the + Record is directly returned from a query on a database. For other records, attempting + to access a field by name will result in an InvalidOperationException. +
+ The Record object should be
+ Win32 MSI API: + MsiCreateRecord +
+ The Record object should be
+ Win32 MSI API: + MsiCreateRecord +
+ Win32 MSI API: + MsiRecordGetFieldCount +
+ When getting a field, the type of the object returned depends on the type of the Record field. + The object will be one of: Int16, Int32, String, Stream, or null. +
+ When setting a field, the type of the object provided will be converted to match the View + query that returned the record, or if Record was not returned from a view then the type of + the object provided will determine the type of the Record field. The object should be one of: + Int16, Int32, String, Stream, or null. +
+ Record fields are indexed starting with 1. Field 0 is a special format field. +
+ When getting a field, the type of the object returned depends on the type of the Record field. + The object will be one of: Int16, Int32, String, Stream, or null. If the Record was returned + from a View, the type will match that of the field from the View query. Otherwise, the type + will match the type of the last value set for the field. +
+ When setting a field, the type of the object provided will be converted to match the View + query that returned the Record, or if Record was not returned from a View then the type of + the object provided will determine the type of the Record field. The object should be one of: + Int16, Int32, String, Stream, or null. +
+ The type-specific getters and setters are slightly more efficient than this property, since + they don't have to do the extra work to infer the value's type every time. +
+ Win32 MSI APIs: + MsiRecordGetInteger, + MsiRecordGetString, + MsiRecordSetInteger, + MsiRecordSetString +
+ This method is only provided for interop purposes. A Record object
+ should normally be obtained by calling
The handle will be closed when this object is disposed or finalized.
++ Win32 MSI API: + MsiRecordClearData +
+ Win32 MSI API: + MsiRecordIsNull +
+ The returned data size is 0 if the field is null, non-existent, + or an internal object pointer. The method also returns 0 if the handle is not a valid + Record handle. +
+ If the data is in integer format, the property returns 2 or 4. +
+ If the data is in string format, the property returns the character count + (not including the NULL terminator). +
+ If the data is in stream format, the property returns the byte count. +
+ Win32 MSI API: + MsiRecordDataSize +
The returned data size is 0 if the field is null, non-existent, + or an internal object pointer. The method also returns 0 if the handle is not a valid + Record handle. +
+ If the data is in integer format, the property returns 2 or 4. +
+ If the data is in string format, the property returns the character count + (not including the NULL terminator). +
+ If the data is in stream format, the property returns the byte count. +
+ Win32 MSI API: + MsiRecordGetInteger +
+ Win32 MSI API: + MsiRecordGetInteger +
+ Win32 MSI API: + MsiRecordSetInteger +
+ Win32 MSI API: + MsiRecordSetInteger +
+ Win32 MSI API: + MsiRecordGetString +
+ Win32 MSI API: + MsiRecordSetString +
+ This method is capable of directly extracting substorages. To do so, first select both the + `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. + However, substorages may only be extracted from a database that is open in read-only mode. +
+ Win32 MSI API: + MsiRecordReadStream +
+ This method is capable of directly extracting substorages. To do so, first select both the + `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. + However, substorages may only be extracted from a database that is open in read-only mode. +
+ This method is not capable of reading substorages. To extract a substorage,
+ use
+ Win32 MSI API: + MsiRecordReadStream +
+ This method is not capable of reading substorages. To extract a substorage,
+ use
+ The contents of the specified file are read into a stream object. The stream persists if + the Record is inserted into the Database and the Database is committed. +
+ To reset the stream to its beginning you must pass in null for filePath. + Do not pass an empty string, "", to reset the stream. +
+ Setting a stream with this method is more efficient than setting a field to a + FileStream object. +
+ Win32 MSI API: + MsiRecordsetStream +
+ The contents of the specified file are read into a stream object. The stream persists if + the Record is inserted into the Database and the Database is committed. + To reset the stream to its beginning you must pass in null for filePath. + Do not pass an empty string, "", to reset the stream. +
+ Setting a stream with this method is more efficient than setting a field to a + FileStream object. +
+ The stream persists if the Record is inserted into the Database and the Database is committed. +
+ Win32 MSI API: + MsiRecordsetStream +
+ The stream persists if the Record is inserted into the Database and the Database is committed. +
+ If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. +
+ Win32 MSI API: + MsiFormatRecord +
+ If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. +
+ Win32 MSI API: + MsiFormatRecord +
+ Win32 MSI API: + MsiFormatRecord +
+ Win32 MSI API: + MsiFormatRecord +
+ This enumeration MUST stay in sync with the + unmanaged equivalent in RemoteMsiSession.h! +
+ The implementation of this delegate is provided by the + custom action host DLL. +
+ This object is associated with a standard set of action functions, + each performing particular operations on data from one or more tables. Additional + custom actions may be added for particular product installations. The basic engine + function is a sequencer that fetches sequential records from a designated sequence + table, evaluates any specified condition expression, and executes the designated + action. Actions not recognized by the engine are deferred to the UI handler object + for processing, usually dialog box sequences. +
+ Note that only one Session object can be opened by a single process. +
+ Normally there is no need to close this Database object. The same object can be + used throughout the lifetime of the Session, and it will be closed when the Session + is closed. +
+ Win32 MSI API: + MsiGetActiveDatabase +
+ Win32 MSI API: + MsiGetLanguage +
+ Win32 MSI APIs: + MsiGetProperty, + MsiSetProperty +
+ This method is only provided for interop purposes. A Session object
+ should normally be obtained by calling
+ Logging may be selectively enabled for the various message types.
+ See the
+ If record field 0 contains a formatting string, it is used to format the data in + the other fields. Else if the message is an error, warning, or user message, an attempt + is made to find a message template in the Error table for the current database using the + error number found in field 1 of the record for message types and return values. +
+ The
+ Note, this method never returns Cancel or Error values. Instead, appropriate + exceptions are thrown in those cases. +
+ Win32 MSI API: + MsiProcessMessage +
+ Win32 MSI API: + MsiProcessMessage +
+ Win32 MSI API: + MsiProcessMessage +
+ Win32 MSI API: + MsiEvaluateCondition +
+ Win32 MSI API: + MsiEvaluateCondition +
+ Win32 MSI API: + MsiFormatRecord +
+ Win32 MSI API: + MsiFormatRecord +
+ Win32 MSI API: + MsiFormatRecord +
+ Note this is not the correct method for getting ordinary session properties. For that, + see the indexer on the Session class. +
+ Win32 MSI API: + MsiGetProductProperty +
+ Win32 MSI API: + MsiVerifyDiskSpace +
+ Win32 MSI API: + MsiEnumComponentCosts +
+ Note that only the following run modes are available to read from
+ a deferred custom action:
+
+
+ Win32 MSI API: + MsiGetMode +
+ Win32 MSI API: + MsiSetMode +
+ Win32 MSI API: + MsiGetSourcePath +
+ Win32 MSI API: + MsiGetTargetPath +
+ Setting the target path of a directory changes the path specification for the directory + in the in-memory Directory table. Also, the path specifications of all other path objects + in the table that are either subordinate or equivalent to the changed path are updated + to reflect the change. The properties for each affected path are also updated. +
+ If an error occurs in this function, all updated paths and properties revert to + their previous values. Therefore, it is safe to treat errors returned by this function + as non-fatal. +
+ Do not attempt to configure the target path if the components using those paths + are already installed for the current user or for a different user. Check the + ProductState property before setting the target path to determine if the product + containing this component is installed. +
+ Win32 MSI API: + MsiSetTargetPath +
+ The SetInstallLevel method sets the following:
+
+ If 0 or a negative number is passed in the ilnstallLevel parameter,
+ the current installation level does not change, but all features are still
+ updated based on the current installation level.
+
+ Win32 MSI API: + MsiSetInstallLevel +
+ The DoAction method executes the action that corresponds to the name supplied. If the + name is not recognized by the installer as a built-in action or as a custom action in + the CustomAction table, the name is passed to the user-interface handler object, which + can invoke a function or a dialog box. If a null action name is supplied, the installer + uses the upper-case value of the ACTION property as the action to perform. If no property + value is defined, the default action is performed, defined as "INSTALL". +
+ Actions that update the system, such as the InstallFiles and WriteRegistryValues + actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction + is called from a custom action that is scheduled in the InstallExecuteSequence table + between the InstallInitialize and InstallFinalize actions. Actions that do not update the + system, such as AppSearch or CostInitialize, can be called. +
+ Win32 MSI API: + MsiDoAction +
+ The DoAction method executes the action that corresponds to the name supplied. If the + name is not recognized by the installer as a built-in action or as a custom action in + the CustomAction table, the name is passed to the user-interface handler object, which + can invoke a function or a dialog box. If a null action name is supplied, the installer + uses the upper-case value of the ACTION property as the action to perform. If no property + value is defined, the default action is performed, defined as "INSTALL". +
+ Actions that update the system, such as the InstallFiles and WriteRegistryValues + actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction + is called from a custom action that is scheduled in the InstallExecuteSequence table + between the InstallInitialize and InstallFinalize actions. Actions that do not update the + system, such as AppSearch or CostInitialize, can be called. +
+ If the called action is a deferred, rollback, or commit custom action, then the supplied
+
+ Win32 MSI API: + MsiDoAction +
+ This method queries the specified table, ordering the actions by the numbers in the Sequence column. + For each row retrieved, an action is executed, provided that any supplied condition expression does + not evaluate to FALSE. +
+ An action sequence containing any actions that update the system, such as the InstallFiles and + WriteRegistryValues actions, cannot be run by calling DoActionSequence. The exception to this rule is if + DoActionSequence is called from a custom action that is scheduled in the InstallExecuteSequence table + between the InstallInitialize and InstallFinalize actions. Actions that do not update the system, such + as AppSearch or CostInitialize, can be called. +
+ Win32 MSI API: + MsiSequence +
+ If this method is called with a new source, the installer adds the source + to the end of the source list. +
+ If this method is called with a source already existing in the source + list, it has no effect. +
+ Win32 MSI APIs: + MsiSourceListAddSource, + MsiSourceListAddSourceEx +
+ If this method is called with a new source and
+ If this method is called with a source already existing in the source
+ list and
+ If the method is called with an existing source in the source list
+ and
+ If the method is called with a new source and Index is set to a
+ non-zero value, the source is inserted at the position specified by
+
+ If
+ Win32 MSI API: + MsiSourceListAddSourceEx +
+ Win32 MSI API: + MsiSourceListClearAll +
+ Win32 MSI API: + MsiSourceListClearAllEx +
+ Win32 MSI API: + MsiSourceListClearAllEx +
+ Win32 MSI API: + MsiSourceListClearSource +
+ Win32 MSI API: + MsiSourceListEnumSources +
+ Win32 MSI APIs: + MsiSourceListForceResolution, + MsiSourceListForceResolutionEx +
+
+ Win32 MSI API: + MsiSourceListGetInfo +
+ Win32 MSI API: + MsiSourceListAddMediaDisk +
+ Win32 MSI API: + MsiSourceListClearAllEx +
+ Win32 MSI API: + MsiSourceListClearMediaDisk +
+ Win32 MSI API: + MsiSourceListEnumMediaDisks +
+ The SummaryInfo object should be
+ Win32 MSI API: + MsiGetSummaryInformation +
+ The Title summary information property briefly describes the type of installer package. Phrases + such as "Installation Database" or "Transform" or "Patch" may be used for this property. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Subject summary information property conveys to a file browser the product that can be installed using + the logic and data in this installer database. For example, the value of the summary property for + Microsoft Office 97 would be "Microsoft Office 97 Professional". This value is typically set from the + installer property ProductName. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Author summary information property conveys to a file browser the manufacturer of the installation + database. This value is typically set from the installer property Manufacturer. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Keywords summary information property is used by file browsers to hold keywords that permit the + database file to be found in a keyword search. The set of keywords typically includes "Installer" as + well as product-specific keywords, and may be localized. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Comments summary information property conveys the general purpose of the installer database. By convention, + the value for this summary property is set to the following: +
+ "This installer database contains the logic and data required to install <product name>." +
+ where <product name> is the name of the product being installed. In general the value for this summary + property only changes in the product name, nothing else. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Template summary information propery indicates the platform and language versions supported by the database. +
+ The syntax of the Template Summary property information is: + [platform property][,platform property][,...];[language id][,language id][,...] +
+ For example, the following are all valid values for the Template Summary property:
+
+
+
+ If this is a 64-bit Windows Installer, enter Intel64 in the Template summary information property. Note that an + installation package cannot have both the Intel and Intel64 properties set. +
+ If the current platform does not match one of the platforms specified then the installer will not process the + package. Not specifying a platform implies that the package is platform-independent. +
+ Entering 0 in the language ID field of the Template summary information property, or leaving this field empty, + indicates that the package is language neutral. +
+ There are variations of this property depending on whether it is in a source installer database or a transform. +
+ Source Installer Database - Only one language can be specified in a source installer database. Merge Modules are + the only packages that may have multiple languages. For more information, see Multiple Language Merge Modules. +
+ Transform - In a transform file, only one language may be specified. The specified platform and language determine + whether a transform can be applied to a particular database. The platform property and the language property can + be left blank if no transform restriction relies on them to validate the transform. +
+ This summary property is REQUIRED. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The installer sets the Last Saved By summary information property to the value of the LogonUser property during + an administrative installation. The installer never uses this property and a user never needs to modify it. + Developers of a database editing tool may use this property to track the last person to modify the database. + This property should be left set to null in a final shipping database. +
+ In a transform, this summary property contains the platform and language ID(s) that a database should have + after it has been transformed. The property specifies to what the Template should be set in the new database. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Revision Number summary information property contains the package code for the installer package. The + package code is a unique identifier of the installer package. +
+ The Revision Number summary information property of a patch package specifies the GUID patch code for + the patch. This is followed by a list of patch code GUIDs for obsolete patches that are removed when this + patch is applied. The patch codes are concatenated with no delimiters separating GUIDs in the list. +
+ The Revision Number summary information property of a transform package lists the product code GUIDs + and version of the new and original products and the upgrade code GUID. The list is separated with + semicolons as follows. +
+ Original-Product-Code Original-Product-Version ; New-Product Code New-Product-Version; Upgrade-Code +
+ This summary property is REQUIRED. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The CreatingApp summary information property conveys which application created the installer database. + In general the value for this summary property is the name of the software used to author this database. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The LastPrintTime summary information property can be set to the date and time during an administrative + installation to record when the administrative image was created. For non-administrative installations + this property is the same as the CreateTime summary information property. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The CreateTime summary information property conveys when the installer database was created. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The LastSaveTime summary information property conveys when the last time the installer database was + modified. Each time a user changes an installation the value for this summary property is updated to + the current system time/date at the time the installer database was saved. Initially the value for + this summary property is set to null to indicate that no changes have yet been made. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Codepage summary information property is the numeric value of the ANSI code page used for any + strings that are stored in the summary information. Note that this is not the same code page for + strings in the installation database. The Codepage summary information property is used to translate + the strings in the summary information into Unicode when calling the Unicode API functions. The + Codepage summary information property must be set before any string properties are set in the + summary information. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ For an installation package, the PageCount summary information property contains the minimum + installer version required. For Windows Installer version 1.0, this property must be set to the + integer 100. For 64-bit Windows Installer Packages, this property must be set to the integer 200. +
+ For a transform package, the PageCount summary information property contains minimum installer + version required to process the transform. Set to the greater of the two PageCount summary information + property values belonging to the databases used to generate the transform. +
+ The PageCount summary information property is set to null in patch packages. +
+ This summary property is REQUIRED. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The WordCount summary information property indicates the type of source file image. If this property is + not present, it defaults to 0. Note that this property is stored in place of the standard Count property. +
+ This property is a bit field. New bits may be added in the future. At present the following bits are
+ available:
+
+
+
+ These are combined to give the WordCount summary information property one of the following values
+ indicating a type of source file image:
+
+
+
+ Note that if the package is marked as compressed (bit 1 is set), the installer only installs files
+ located at the root of the source. In this case, even files marked as uncompressed in the File table must
+ be located at the root to be installed. To specify a source image that has both a cabinet file (compressed
+ files) and uncompressed files that match the tree in the Directory table, mark the package as uncompressed
+ by leaving bit 1 unset (value=0) in the WordCount summary information property and set
+
+ For a patch package, the WordCount summary information property specifies the patch engine that was used + to create the patch files. The default value is 1 and indicates that MSPATCH was used to create the patch + A value of "2" means that the patch is using smaller, optimized, files available only with Windows Installer + version 1.2 or later. A patch with a WordCount of "2" fails immediately if used with a Windows Installer + version earlier than 1.2. A patch with a WordCount of "3" fails immediately if used with a Windows Installer + version earlier than 2.0. +
+ This summary property is REQUIRED. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The CharacterCount summary information property is only used in transforms. This part of the summary + information stream is divided into two 16-bit words. The upper word contains the transform validation + flags. The lower word contains the transform error condition flags. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ The Security summary information property conveys whether the package should be opened as read-only. The database
+ editing tool should not modify a read-only enforced database and should issue a warning at attempts to modify a
+ read-only recommended database. The following values of this property are applicable to Windows Installer files:
+
+
+
+ This property should be set to read-only recommended (2) for an installation database and to read-only + enforced (4) for a transform or patch. +
+ Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +
+ This method may only be called once after all the property values have been set. Properties may + still be read after the stream is written. +
+ Win32 MSI API: + MsiSummaryInfoPersist +
+ This property queries the database every time it is called, + to ensure the returned values are up-to-date. For best performance, + hold onto the returned collection if using it more than once. +
+ The values are expressed as question-mark tokens, to be supplied by the record. +
+ The columns are listed explicitly in the SELECT string, as opposed to using "SELECT *". +
+ Win32 MSI API: + MsiViewGetColumnInfo +
+ Win32 MSI API: + MsiViewExecute +
+ Win32 MSI API: + MsiViewExecute +
+ The Record object should be
+ Win32 MSI API: + MsiViewFetch +
+ You can update or delete a record immediately after inserting, or seeking provided you + have NOT modified the 0th field of the inserted or sought record. +
+ To execute any SQL statement, a View must be created. However, a View that does not + create a result set, such as CREATE TABLE, or INSERT INTO, cannot be used with any of + the Modify methods to update tables though the view. +
+ You cannot fetch a record containing binary data from one database and then use
+ that record to insert the data into another database. To move binary data from one database
+ to another, you should export the data to a file and then import it into the new database
+ using a query and the
+ Note that custom actions can only add, modify, or remove temporary rows, columns, + or tables from a database. Custom actions cannot modify persistent data in a database, + such as data that is a part of the database stored on disk. +
+ Win32 MSI API: + MsiViewModify +
+ The Record must have been obtained by calling
+ See
+ Win32 MSI API: + MsiViewModify +
+ Fails if a row with the same primary keys exists. Fails with a read-only database. + This method cannot be used with a View containing joins. +
+ See
+ Win32 MSI API: + MsiViewModify +
+ Only non-primary keys can be updated. The Record must have been obtained by calling
+
+ See
+ Win32 MSI API: + MsiViewModify +
+ Updates record if the primary keys match an existing row and inserts if they do not match. + Fails with a read-only database. This method cannot be used with a View containing joins. +
+ See
+ Win32 MSI API: + MsiViewModify +
+ The Record must have been obtained by calling
+ See
+ Win32 MSI API: + MsiViewModify +
+ The Record must have been obtained by calling
+ See
+ Win32 MSI API: + MsiViewModify +
+ Fails if a row with the same primary key exists. Works only with read-write records. + This method cannot be used with a View containing joins. +
+ See
+ Win32 MSI API: + MsiViewModify +
+ After seeking, the Record may then be used for subsequent Update, Delete, and Refresh + operations. All primary key columns of the table must be in the query and the Record must + have at least as many fields as the query. Seek cannot be used with multi-table queries. + This method cannot be used with a View containing joins. +
+ See
+ Win32 MSI API: + MsiViewModify +
+ Works only with read-write records. This method cannot be used with a + View containing joins. +
+ See
+ Win32 MSI API: + MsiViewModify +
+ The Record must have been obtained by calling
+ See
+ Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +
+ Checks for duplicate keys. The Record must have been obtained by
+ calling
+ See
+ Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +
+ Works with read-write and read-only records. This method cannot be used with + a View containing joins. +
+ See
+ Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +
+ Validation does not check for the existence of the primary keys of this row in properties + or strings. Does not check if a column is a foreign key to multiple tables. Works with + read-write and read-only records. This method cannot be used with a View containing joins. +
+ See
+ Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +
+ Each Record object should be
+ Win32 MSI API: + MsiViewFetch +