Как получить доступ к бинарной таблице и использовать в управлении кодом пользовательские действия? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь выполнить сценарии sql без использования встроенной функции installshield. Я сохранил файлы sql в двоичной таблице (не в файлах поддержки, поскольку это небезопасно). В файле msi я видел полный путь любого двоичного файла:заменены фигурными скобками "{binaryname}".Как я могу использовать двоичное имя с фигурными скобками в других пользовательских действиях?Есть ли способ доступа к публичным свойствам в соответствии с требованиями?

1 Ответ

0 голосов
/ 02 марта 2019

Я не согласен с мнением, что Двоичная таблица более или менее безопасна, чем таблица ISSetupFile.Оба они хранят (ссылаются на) двоичные потоки в своих записях и могут быть изменены преобразованиями.Возможно, вы имеете в виду легкость, с которой уже извлеченный файл может быть изменен?Но давайте отложим это и сосредоточимся на вашем вопросе.

Фигурные скобки - это визуальные обозначения, используемые в этом случае InstallShield для указания ссылки на двоичную таблицу.Это не нотация, распознаваемая установщиком Windows.Поэтому вам нужно найти что-то, что есть.

Если вы хотите использовать содержимое записи двоичной таблицы во время настраиваемого действия, есть две опции:

  1. Пусть это будет (часть) пользовательского действия, которое вы выполняете, причем само определение CustomAction ссылается на двоичную запись.Например, настраиваемое действие типа 1 часто запускает DLL, хранящуюся в двоичной таблице.Вы можете добавить дополнительные данные к этой dll, если вы управляете ею.
  2. Извлеките двоичную запись самостоятельно, запросив таблицу.Обратите внимание, что это может быть сделано только во время настраиваемого действия в непосредственном режиме, поэтому, если оно понадобится вам в отложенных режимах (выполнение в сценарии), вам придется извлечь его заранее, либо поместить в файловую систему, либо переправить (er,передать его через CustomActionData.

Если вы выполняете последнее в DLL C ++, вам, вероятно, понадобятся следующие функции:

  • MsiGetActiveDatabase
  • MsiDatabaseOpenView: SELECT * FROM `Binary` WHERE `Name`=?
  • MsiViewExecute: передать запись, содержащую имя из фигурных скобок
  • MsiViewFetch
  • MsiRecordReadStream
  • MsiCloseHandle1029 *

Поскольку вы, вероятно, знаете имя записи вашей двоичной таблицы, вы можете жестко закодировать ее как 'namehere' вместо ? и пропустить запись.Обратите внимание на пометки вокруг имен таблиц и столбцов, но апострофы вокруг значения.Или, для большей безопасности, вы можете использовать заполнитель вопросительного знака и заполнить запись с помощью MsiCreateRecord и MsiRecordSetString.

Другие языки по-разному предоставляют одну и ту же базовую функциональность.Посмотрите, например, пример SDK WIStream.vbs , чтобы ознакомиться с обзором VBScript, но учтите, что вам придется запускать как пользовательское действие вместо внешнего скрипта.

...