【问题标题】:How to insert a value of data type 'Formatted' into the MSI database如何将数据类型“格式化”的值插入 MSI 数据库
【发布时间】:2016-02-02 12:31:39
【问题描述】:

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

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

它总是抛出异常。我可以毫无问题地将值添加到动作类型中。问题来自于格式化数据类型的目标。

【问题讨论】:

    标签: c# windows windows-installer


    【解决方案1】:

    如果是 view.Execute 引发了异常,那么就这么说吧,只是为了明确一点。此外,在异常本身(或内部异常)的某处,应该有一个与 MSI 相关的错误编号或文本,以 MSI 术语说明异常的详细信息。

    反正Target是Formatted的,也就是文本。文本字符串的最大长度为 255 个字符,而您的文本长度按我计算超过 255 个字符。这很可能是问题所在。您可以使用非常小的字符串进行测试以进行验证。您的替代方法是将脚本插入二进制表并相应地更改自定义操作。

    【讨论】:

    • 文本的长度是问题。但是如果我在 orca 中打开 msi 文件,我可以找到超过 255 个字符长度的脚本。我们可以在内部做些什么来插入更多的脚本直接在表格中超过 255 个字符
    • 问题是当我们直接在安装屏蔽中插入一个 vbs 时,它正在更新。有没有办法从代码中做类似的事情。
    • 您的代码通常是正确的。当我使用“INSERT INTO CustomAction (Action,Type,Target) VALUES ('DeleteAction',3174, 'some crap')”运行相同的更新时,它可以工作。问题在于字符串的长度,最大值为 255。如果不查看 InstallShield 生成的 MSI,我们无法知道哪些确切有效,哪些无效。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2019-08-28
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多