インストーラーからレジストリにインストール場所を書き込みます
-
28-10-2019 - |
質問
私は使っている WIX 3.6 インストーラーを作成します。
ニーズの1つは、Allusersプロパティに応じて、HKCUまたはHKLMのいずれかのレジストリにインストール場所の場所を書き込むことです。
今、私が行った研究に基づいて、私は以下がうまくいくべきだと思います
<RegistryKey Root="HKMU"
Key="Software\OpenCover"
Action="createAndRemoveOnUninstall">
<RegistryValue Name="Location"
Type="string"
Value="[APPLICATIONFOLDER]"
Action="write"
KeyPath="yes" />
</RegistryKey>
問題は、Allusers = "" IE HKMUがHKCUと解釈される場合にのみ機能することです。
Allusers = 1であるPARACHINEインストールを試してみると、エントリは予想どおりHKLMに書き込まれませんが、インストーラーログファイルを見ると、WriteregistryValuesへの呼び出しが表示されます。
MSI (s) (D4:14) [22:46:24:901]: Executing op: ActionStart(Name=WriteRegistryValues,Description=Writing system registry values,Template=Key: [1], Name: [2], Value: [3])
Action 22:46:24: WriteRegistryValues. Writing system registry values
MSI (s) (D4:14) [22:46:24:902]: Executing op: ProgressTotal(Total=2,Type=1,ByteEquivalent=13200)
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegOpenKey(Root=-1,Key=Software\OpenCover,,BinaryType=0,,)
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegAddValue(Name=ConsoleLocation,Value=C:\Program Files (x86)\OpenCover\,)
WriteRegistryValues: Key: \Software\OpenCover, Name: ConsoleLocation, Value: C:\Program Files (x86)\OpenCover\
MSI (s) (D4:14) [22:46:24:906]: Executing op: RegCreateKey()
WriteRegistryValues: Key: \Software\OpenCover, Name: , Value:
誰かが私が完了する必要があるタスクを達成する方法を説明できますか
解決
問題は、実際には64ビットプラットフォームの32ビットインストーラーに関係しています。
このシナリオでallusers = "1"が使用されると、hkmuでマークされたレジストリエントリが実際に記述されていますが、この場合、hklm software wow6432node opencoverです。 HKLMとしてマークされたエントリも同じ方法でリダイレクトされていると思われます。
残念ながら、ドキュメント writeregistryvaluesアクション 「魔法」のリダイレクトの32/64ビットと、実際のレジストリエントリに関する詳細はログに表示されないことを説明していません。
何が起こっているかについての洞察を得るために、次の記事は観察された行動を分かります WOW64の影響を受けるレジストリキー. 。この記事から、インストーラーがフォルダーhklm ソフトウェアに書いている「考える」ことがわかりますが、これは実際には 「リダイレクト」 64ビットプラットフォーム上の32ビットプロセス用のhklm wow6432node ソフトウェアへ。したがって、ログファイルに反映されない理由を説明します。この記事では、Allusers = ""およびHKMUがHKCUであるとき、なぜこれらのエントリがそうであるためにエントリが期待される場所に表示されるのかについても説明しています。 「共有」 32〜64ビットアプリケーション。
他のヒント
私の推測では、インストーラーが昇格しておらず(UACが有効になっていますか?)、HKLMへの書き込みがHKCUにリダイレクトされていると思います。
ところで、アプリケーション内からWindowsインストーラーAPIを使用して、このメタデータを保存するレジストリキーを記述する必要なく、アップグレードコード、ProductCode、ProductInformation(InstallLocation)をクエリすることも検討できます。