如何将数据类型 'Formatted' 的值插入 MSI 数据库

How to insert a value of data type 'Formatted' into the MSI database

我正在尝试在 msi.The 的 CustomAction table 中添加自定义操作,问题是列名称 Target 的数据类型 Formatted.It 在我尝试时失败将字符串插入到列中,因为请求的类型是格式化的。

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 我能够将值添加到 Action Type 中而没有任何问题 problem.The Target 是格式化数据类型。

如果是 view.Execute 抛出异常,那么就这么说,只是为了明确。同样在异常本身(或内部异常)的某处,应该有一个 MSI-related 错误号或文本,以 MSI 术语说明异常的详细信息。

无论如何,目标是格式化的,它是文本。文本字符串的最大长度为 255 个字符,而您的文本长度按我的统计超过了 255 个字符。这很可能是问题所在。您可以使用非常小的字符串进行测试以进行验证。您的替代方法是将脚本插入二进制 table 并相应地更改自定义操作。

我不会重新格式化字符串,所以在使用之前检查它:

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);