1

Installer.OnCommitted コールバックでアプリケーションの ProductCode を知る必要があります。これを決定する明白な方法はないようです。

4

4 に答える 4

2

CustomActionData プロパティで /productCode=[ProductCode] を使用すると、製品コードのハードコーディングを回避できます。

于 2009-07-31T17:08:52.893 に答える
1

最終的に、Visual Studio の CustomActionData プロパティを使用して、Installer クラスに製品コードをコマンド ライン引数として渡しました (例: /productcode={31E1145F-B833-47c6-8C80-A55F306B8A6C})。 Context.Parameters StringDictionary を使用するインストーラー クラス

string productCode = (string)Context.Parameters["productcode"];
于 2008-09-14T12:18:39.967 に答える
0

MSI 関数 MsiGetProperty を使用して、ProductCode プロパティの名前を取得できます。私は .NET インストーラーを作成したことがないので、この場合にうまくいくかどうかはわかりません。

于 2008-09-14T02:24:02.000 に答える
0

@Chris Tyburからの提案はうまくいくようです

ここに私のC#コードがあります:

        public static string GetProductCode(string fileName)
        {
            IntPtr hInstall = IntPtr.Zero;
            try
            {
                uint num = MsiOpenPackage(fileName, ref hInstall);
                if ((ulong)num != 0)
                {
                    throw new Exception("Cannot open database: " + num);
                }

                int pcchValueBuf = 255;
                StringBuilder szValueBuf = new StringBuilder(pcchValueBuf);
                num = MsiGetProperty(hInstall, "ProductCode", szValueBuf, ref pcchValueBuf);
                if ((ulong)num != 0)
                {
                    throw new Exception("Failed to Get Property ProductCode: " + num);
                }
                return szValueBuf.ToString();
            }
            finally
            {
                if (hInstall != IntPtr.Zero)
                {
                    MsiCloseHandle(hInstall);
                }
            }
        }

        [DllImport("msi.dll", CharSet = CharSet.Unicode, EntryPoint = "MsiGetPropertyW", ExactSpelling = true, SetLastError = true)]
        private static extern uint MsiGetProperty(IntPtr hInstall, string szName, [Out] StringBuilder szValueBuf, ref int pchValueBuf);
        [DllImport("msi.dll", CharSet = CharSet.Unicode, EntryPoint = "MsiOpenPackageW", ExactSpelling = true, SetLastError = true)]
        private static extern uint MsiOpenPackage(string szDatabasePath, ref IntPtr hProduct);
        [DllImport("msi.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
        private static extern int MsiCloseHandle(IntPtr hAny);

FWIW: この MSDN サイトには、懸念の原因となる可能性のある小さな宣伝文があります: https://docs.microsoft.com/en-us/windows/win32/msi/obtaining-context-information-for-deferred-execution-カスタムアクション

Function    Description
MsiGetProperty  Supports a limited set of properties when used with deferred execution custom actions:
                the CustomActionData property, ProductCode property, and UserSID property.Commit custom
                actions cannot use the MsiGetProperty function to obtain the ProductCode property.
                Commit custom actions can use the CustomActionData property to obtain the product code.

コールアウトに注意してくださいcannot use the MsiGetProperty function to obtain the ProductCode property。だからYMMV。

インストールされている MSI セットアップの製品GUIDを確認するにはどうすればよいですか? COM API を使用してこれを収集できます (現在のバージョンでは VBScript が表示されます)。これも調べる価値があります。

于 2021-05-04T13:17:00.410 に答える