如何访问二进制 table 并在管理代码自定义操作中使用?
How to access the binary table and use in manage code custom actions?
我试图在不使用本机 InstallShield 功能的情况下执行 SQL 脚本。我已将 SQL 文件存储在二进制 table 中(不在支持文件中,因为它不安全)。在 MSI 文件中,我看到任何二进制文件的完整路径都被替换为 {binaryname}
花括号名称。如何在其他自定义操作中使用带大括号的二进制名称?有什么方法可以让我们在自定义操作中访问 public 属性吗?
我不同意 Binary table 比 ISSetupFile table 更安全或更不安全的观点。它们都在其记录中存储(引用)二进制流,并且可以通过转换进行更改。也许您的意思是可以轻松更改已提取的文件?但是让我们把那个放在一边,专注于你的问题。
大括号是 InstallShield 在本例中用来指示二进制 table 引用的视觉符号。它不是 Windows 安装程序识别的符号。所以你必须找到一些东西。
如果您想在自定义操作期间使用二进制 table 记录的内容,有两个选项:
- 让它成为您正在执行的自定义操作(的一部分),让 CustomAction 定义本身引用二进制记录。例如。类型 1 自定义操作通常 运行 是存储在二进制 table 中的 dll。如果您控制它,您可以将额外的数据附加到该 dll。
- 通过查询 table 自行提取二进制记录。请注意,这只能在即时模式自定义操作期间完成,因此如果您在延迟模式(脚本内执行)期间需要它,您将必须提前提取它,然后将其放在文件系统或走私(呃,通过)它通过 CustomActionData。
如果您在 C++ DLL 中执行后者,您可能需要的函数至少包括以下内容:
- MsiGetActiveDatabase
- MsiDatabaseOpenView:
SELECT * FROM `Binary` WHERE `Name`=?
- MsiViewExecute: 传递包含大括号内名称的记录
- MsiViewFetch
- MsiRecordReadStream
- MsiCloseHandle
由于您大概知道二进制 table 记录的名称,您可以将其硬编码为 'namehere'
代替 ?
并跳过该记录。请注意 table 和列名周围的反引号,但值周围的撇号。或者,为了更安全,您可以使用问号占位符,并使用 MsiCreateRecord 和 MsiRecordSetString 填充记录。
其他语言以不同的方式展示相同的底层功能。例如,请参阅 SDK 示例 WIStream.vbs 以了解 VBScript 中的概述,但请注意,您的示例必须 运行 作为自定义操作而不是外部脚本。
我试图在不使用本机 InstallShield 功能的情况下执行 SQL 脚本。我已将 SQL 文件存储在二进制 table 中(不在支持文件中,因为它不安全)。在 MSI 文件中,我看到任何二进制文件的完整路径都被替换为 {binaryname}
花括号名称。如何在其他自定义操作中使用带大括号的二进制名称?有什么方法可以让我们在自定义操作中访问 public 属性吗?
我不同意 Binary table 比 ISSetupFile table 更安全或更不安全的观点。它们都在其记录中存储(引用)二进制流,并且可以通过转换进行更改。也许您的意思是可以轻松更改已提取的文件?但是让我们把那个放在一边,专注于你的问题。
大括号是 InstallShield 在本例中用来指示二进制 table 引用的视觉符号。它不是 Windows 安装程序识别的符号。所以你必须找到一些东西。
如果您想在自定义操作期间使用二进制 table 记录的内容,有两个选项:
- 让它成为您正在执行的自定义操作(的一部分),让 CustomAction 定义本身引用二进制记录。例如。类型 1 自定义操作通常 运行 是存储在二进制 table 中的 dll。如果您控制它,您可以将额外的数据附加到该 dll。
- 通过查询 table 自行提取二进制记录。请注意,这只能在即时模式自定义操作期间完成,因此如果您在延迟模式(脚本内执行)期间需要它,您将必须提前提取它,然后将其放在文件系统或走私(呃,通过)它通过 CustomActionData。
如果您在 C++ DLL 中执行后者,您可能需要的函数至少包括以下内容:
- MsiGetActiveDatabase
- MsiDatabaseOpenView:
SELECT * FROM `Binary` WHERE `Name`=?
- MsiViewExecute: 传递包含大括号内名称的记录
- MsiViewFetch
- MsiRecordReadStream
- MsiCloseHandle
由于您大概知道二进制 table 记录的名称,您可以将其硬编码为 'namehere'
代替 ?
并跳过该记录。请注意 table 和列名周围的反引号,但值周围的撇号。或者,为了更安全,您可以使用问号占位符,并使用 MsiCreateRecord 和 MsiRecordSetString 填充记录。
其他语言以不同的方式展示相同的底层功能。例如,请参阅 SDK 示例 WIStream.vbs 以了解 VBScript 中的概述,但请注意,您的示例必须 运行 作为自定义操作而不是外部脚本。