2016-01-15 4 views
0

Я пытаюсь добавить настраиваемое действие в таблицу CustomAction для msi. Проблема в том, что имя столбца Target имеет тип данных Formatted.It is если я пытаюсь вставить строку в столбец, так как запрошенный тип - Formatted.Как вставить значение типа данных «Отформатировано» в базу данных MSI

WindowsInstaller.Installer ins = (WindowsInstaller.Installer)new Installer(); 

string strFileMsi = @"D:\Pack.msi"; 


Database db3 = ins.OpenDatabase(strFileMsi, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeDirect); 
      System.Console.WriteLine("testing 1"); 



    WindowsInstaller.View vw3 = db3.OpenView("INSERT INTO CustomAction (Action,Type,Target) VALUES ('DeleteAction',3174,'\'Option Explicit\n\n'On Error Resume Next\nDim objFSO, strappfolder, WshShell, strprogramfiles, WshProcessenv\nDim intFilesCount, intSubFolderCount, intFileCount, objGetFolder, ObjFolder\nSet objFSO = CreateObject(\"Scripting.FileSystemObject\") \nset WshShell = CreateObject(\"Wscript.Shell\")\nset WshProcessenv = WshShell.Environment(\"Process\")\nstrprogramfiles = WshProcessenv(\"PROGRAMFILES(x86)\")\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\err.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\err.txt\"\nEnd If\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\out.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\out.txt\"\nEnd If\n\n If ObjFSO.FolderExists(strprogramfiles & \"\\datavision -BMS\") Then\n\n Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n Set objGetFolder = objFSO.GetFolder(strprogramfiles & \"\\datavision -BMS\")\n\n ObjFSO.DeleteFolder strprogramfiles & \"\\datavision -BMS\"\n End If')"); 

      vw3.Execute(null); 
      System.Console.WriteLine("testing"); 

      db3.Commit(); 
      vw3.Close(); 

Он всегда бросает exception.I может добавить значения в тип действий без каких-либо проблем problem.The поставляется с Target, который имеет форматный типа данных.

ответ

1

Если это view.Execute, который выдает исключение, тогда скажите так, просто чтобы быть явным. Также где-то в самом исключении (или внутреннем исключении) должен быть номер ошибки или текст, связанный с MSI, который говорит что-то о деталях исключения в терминах MSI.

В любом случае, цель отформатирована, это текст. Максимальная длина текстовой строки - 255 символов, а длина вашего текста - более 255 символов по моему счету. Это, скорее всего, проблема. Вы можете проверить с помощью очень маленькой строки для проверки. Ваша альтернатива будет заключаться в том, чтобы вставить скрипт в двоичную таблицу и соответствующим образом изменить собственное действие.

+0

Длина текста является issue.But, если я открыть файл Msi в косатке я могу найти сценарии более 255 символов длины . Есть ли что-то, что мы можем сделать внутренне, чтобы вставить скрипт из более чем 255 символов непосредственно в таблицу. –

+0

Проблема заключается в том, что мы вставляем vbs непосредственно в защитный экран, который он обновляет. Есть ли способ сделать аналогичную вещь из кода. –

+0

Ваш код, как правило, правильный. Когда я запускаю такое же обновление с помощью «INSERT INTO CustomAction (Action, Type, Target) VALUES (« DeleteAction », 3174,« немного дерьма »),« он работает. Проблема заключается в длине строки, максимальная - 255. Не глядя на MSI, который генерирует InstallShield, нам не нужно знать, что именно работает, а что нет. – PhilDW

0

я не переформатировать строку поэтому проверить его перед использованием:

WindowsInstaller.View vw3 = db3.OpenView("SELECT * FROM CustomAction"); 

     vw3.Execute(null); 

     Record record = ins.CreateRecord(4); 

     record.StringData[1] = "DeleteAction"; 
     record.IntegerData[2] = 3174; 
     record.StringData[4] = "Option Explicit\n\n'On Error Resume Next\nDim objFSO, strappfolder, WshShell, strprogramfiles, WshProcessenv\nDim intFilesCount, intSubFolderCount, intFileCount, objGetFolder, ObjFolder\nSet objFSO = CreateObject(\"Scripting.FileSystemObject\") \nset WshShell = CreateObject(\"Wscript.Shell\")\nset WshProcessenv = WshShell.Environment(\"Process\")\nstrprogramfiles = WshProcessenv(\"PROGRAMFILES(x86)\")\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\err.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\err.txt\"\nEnd If\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\out.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\out.txt\"\nEnd If\n\n If ObjFSO.FolderExists(strprogramfiles & \"\\datavision -BMS\") Then\n\n Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n Set objGetFolder = objFSO.GetFolder(strprogramfiles & \"\\datavision -BMS\")\n\n ObjFSO.DeleteFolder strprogramfiles & \"\\datavision -BMS\"\n End If"; 

     vw3.Modify(MsiViewModify.msiViewModifyInsert, record); 
Смежные вопросы