2010-06-07 81 views
0

如何在msi文件中設置自定義屬性?我不想使用msiexec來傳遞自定義屬性。我想根據用戶登錄將屬性值保存在msi文件本身中。在msi文件中設置自定義屬性

在此先感謝。

+0

下載由伊恩·舍恩馬爾馬里亞諾寫的WindosInstaller下課後,我沒有得到我猜您正在使用一些工具來創建msi(wix?)並想知道如何設置自定義屬性,對嗎? – Vagaus 2010-06-08 00:41:16

回答

1

請參閱USERNAME property。設置屬性的唯一選項是:在創作時;在命令行中(直接或在變換中);並在一個自定義的行動。但是,您需要的信息可能位於系統設置的某個屬性中。

0

您可以使用下面的代碼(你

從這裏

http://www.codeproject.com/KB/cs/msiinterop/msiinterop.zip

public static bool ChangeProperty(string MsiPath, string property, string value) 
    { 
     bool result = true; 
     IntPtr view = IntPtr.Zero; 
     IntPtr dataBase = IntPtr.Zero; 
     MsiError err; 

     try 
     { 
      err = MsiInterop.MsiOpenDatabase(MsiPath, MsiDbPersistMode.Transact, out dataBase); 
      if (err == MsiError.Success) 
      { 
       string sql = "INSERT INTO Property (Property, Value) VALUES ('" + property + "', '" + value + "')"; 
       err = MsiInterop.MsiDatabaseOpenView(dataBase, sql, out view); 

       err = MsiInterop.MsiViewExecute(view, IntPtr.Zero); 
       if (err == MsiError.FunctionFailed) 
       { 
        string sqlUpdate = @"UPDATE Property SET Value = '" + value + "' WHERE Property = '" + property + "'"; 
        err = MsiInterop.MsiDatabaseOpenView(dataBase, sqlUpdate, out view); 
        err = MsiInterop.MsiViewExecute(view, IntPtr.Zero); 
       } 
      } 
      err = MsiInterop.MsiDatabaseCommit(dataBase); 
     } 
     catch 
     { 
      result = false; 
     } 
     finally 
     { 
      err = MsiInterop.MsiViewClose(view); 
      err = MsiInterop.MsiCloseHandle(dataBase); 
     } 
     return result; 
    }