Inno Setupを使用していて、Windows7のProgram Files (x86)
にあるプログラムを関連付けようとしています。次のものがあります。
#define MyAppName "MyView"
#define MyAppExeName "MyView.exe"
[Setup]
AppName={#MyAppName}
[Registry]
Root: HKCR; Subkey: ".mpl"; ValueType: string; ValueName: ""; ValueData: "MyView"; Flags: uninsdeletevalue
Root: HKCR; Subkey: "MyView"; ValueType: string; ValueName: ""; ValueData: "MyView"; Flags: uninsdeletekey
Root: HKCR; Subkey: "MyView\delta.ico"; ValueType: string; ValueName: ""; ValueData: "{app}\GeoView.EXE,0"
Root: HKCR; Subkey: "MyView\Shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\MYVIEW.EXE"" ""%1"""
協会が機能していない理由について何か提案はありますか?
プログラムを拡張子に関連付けたい場合は、issファイルに次の命令を追加するだけです。
セクションで
[Setup]
ChangesAssociations = yes
^-セットアップはエクスプローラーにインストールの最後にファイルの関連付け情報を更新するように指示し、アンインストールはアンインストールの最後に同じことを行います。
そしてセクションで
[Registry]
Root: HKCR; Subkey: ".mpl"; ValueData: "{#MyAppName}"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#MyAppName}"; ValueData: "Program {#MyAppName}"; Flags: uninsdeletekey; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#MyAppName}\DefaultIcon"; ValueData: "{app}\{#MyAppExeName},0"; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#MyAppName}\Shell\open\command"; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; ValueType: string; ValueName: ""
Root: HKCR; Subkey: ".magi"; ValueData: "MyMAGIApplication"; ValueType: string; ValueName: ""; Flags: uninsdeletevalue
。この命令は、レジストリに「.magi」キーを追加し、HKEY_CLASSES_ROOT(HKCR)でより正確になります。この命令にはValueName=""
も含まれているため、レジストリのデフォルト値を取得します。
Root: HKCR; Subkey: "MyMAGIApplication"; ValueData: "Program MAGI"; ValueType: string; ValueName: ""; Flags: uninsdeletekey
HKCRにキーMyMAGIApplication
を値 "ProgramMAGI"で追加するため。
Root: HKCR; Subkey: "MyMAGIApplication\DefaultIcon"; ValueData: "{app}\MAGI.EXE,0"; ValueType: string; ValueName: ""
実行可能ファイルに含まれるアイコンを関連付けるため。 「0」は、実行可能ファイルMAGI.EXEに存在する最初のアイコンであることを示します。
Root: HKCR; Subkey: "MyMAGIApplication\Shell\open\command"; ValueData: """{app}\MAGI.EXE"" ""%1"""; ValueType: string; ValueName: ""
サブキーShell\open\commandを追加するため。この命令により、ユーザーが拡張子「.magi」のファイルをクリックすると、WindowsはアプリケーションMAGI.EXEを起動できます。
そしてレジストリの結果:
ファイルの関連付けの作成については、以前SO)で回答されていますが、コアドキュメントでは次のように参照されています。
http://www.jrsoftware.org/isfaq.php#assoc
ファイルの関連付けの作成
まず、
[Setup]
セクションディレクティブChangesAssociations
をyes
に設定します。次に、以下に示すように[Registry]
エントリを作成します。[Registry] Root: HKCR; Subkey: ".myp"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue
.myp
は、関連付けている拡張子です。MyProgramFile
は、レジストリに保存されているファイルタイプの内部名です。別のアプリケーションのレジストリキーを誤って上書きしないように、これには一意の名前を使用してください。Root: HKCR; Subkey: "MyProgramFile"; ValueType: string; ValueName: ""; ValueData: "My Program File"; Flags: uninsdeletekey
上記の
My Program File
は、エクスプローラーに表示されるファイルタイプの名前です。Root: HKCR; Subkey: "MyProgramFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\MYPROG.EXE,0"
DefaultIcon
は、ファイルタイプに関連付けるアイコンを含むファイル名を指定するレジストリキーです。,0
は、MYPROG.EXE
の最初のアイコンを使用するようにエクスプローラーに指示します。 (,1
は2番目のアイコンを意味します。)Root: HKCR; Subkey: "MyProgramFile\Shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\MYPROG.EXE"" ""%1"""
Shell\open\command
は、そのタイプのファイルがエクスプローラーでダブルクリックされたときに実行するプログラムを指定するレジストリキーです。周囲の引用符はコマンドラインにあるため、長いファイル名を正しく処理します。
Windowsファイルの関連付けを要約すると、次の3つの主要なレジストリ設定を処理する必要があります。
1.と2に関しては、これらは以前の回答で十分にカバーされていました。 (。magiが以前にSomeOtherMAGICApplicationと関連付けられていた可能性がある点を除きます。この設定は上書きされ、アンインストール時に復元されません。)ただし、完全に機能させるため実際には3.も考慮に入れる必要があります。
さて、ここでFileSample.issから始めましょう:
#define MyAppName "MovToAvi"
#define MyAppNameExt ".mov"
[Setup]
ChangesAssociations=yes
[Languages]
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
[CustomMessages]
german.Assoc=Verknüpfung:
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
; Flags: unchecked
Name: fileassoc; Description: "{cm:AssocFileExtension,{#MyAppName},{#MyAppNameExt}}"; GroupDescription: "{cm:Assoc}"
[Run]
Filename: "{app}\install FileAssoc\AssocBak.cmd"; Parameters: "{#MyAppNameExt} {#MyAppName}"; StatusMsg: "{cm:AssocingFileExtension,{#MyAppName},{#MyAppNameExt}}"; Tasks: fileassoc
[UninstallRun]
Filename: "{app}\install FileAssoc\AssocBak.cmd"; Parameters: "UnAssoc"; RunOnceId: "RemoveAssoc"
[Registry]
;Handled by AssocBak.cmd
;Root: HKCR; Subkey: "{#MyAppNameExt}"; ValueData: "{#MyAppName}"; Flags: uninsdeletekeyifempty; ValueType: string; ValueName: "" ; Tasks: fileassoc
;Doesn't work like this - also handled by AssocBak.cmd
;Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{#MyAppNameExt}\UserChoice"; ValueData: "{#MyAppName}"; ValueType: string; ValueName: "Progid" ; Tasks: fileassoc
Root: HKCR; Subkey: "{#MyAppName}"; ValueData: "Program {#MyAppName}"; ValueType: string; ValueName: "" ; Flags: uninsdeletekey;
Root: HKCR; Subkey: "{#MyAppName}\DefaultIcon"; ValueData: "{app}\Pipe_icon.ico"; ValueType: string; ValueName: "" ;
Root: HKCR; Subkey: "{#MyAppName}\Shell\open\command"; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; ValueType: string; ValueName: "" ;
だからここで何を言うか。さて1つだけがすでに行われています。 2.(および3.)は、タスクアソシエートが有効になっているかどうかに応じて実行され、その作業はAssocBak.cmdを呼び出すことによって実行されます。
ここではInnoPascalコードの代わりにバッチファイルを使用することをお許しください/自由に実装してください。しかし、それが機能している限り、私はそれを維持します。
@Prompt -$G
@set BakFile=BeforeInstallAssoc.dat
@if "%1"=="" @goto :ShowHelp
@pushd %~dp0
@if %1==UnAssoc (
@call :Restore
) else (
@call :DoAndMakeBak %1 %2
)
@popd
@goto :eof
:DoAndMakeBak
@if not exist "%BakFile%" (
@assoc %1 >"%BakFile%"
@assoc %1 %2
@call :ResetUserFileExt %1
) else (
@echo Skipped - Backupfile already exist! Run '%~nx0 u' first or delete '%BakFile%'.
)
@goto :eof
:Restore
:: Attentions putting %BakFile% in quotes gives the Filename and not the File content
@FOR /f "delims== tokens=1,2" %%i IN (%BakFile%) DO @(
set Ext=%%i
set Verb=%%j
)
assoc %Ext%=%Verb%
@call :ResetUserFileExt %Ext%
::@del "%BakFile%"
@goto :eof
:ShowHelp
@echo Assoc with backup
@echo =================
@echo.
@echo Restore:
@echo %~nx0 UnAssoc
@echo.
@echo Set:
@echo %~nx0 ^<AssocExt^> ^<Assochandle^>
@echo Example %~nx0 .mov MovToAvi
@goto :eof
:ResetUserFileExt
::Workaround for
::REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%1\UserChoice" /f /va
@REG ADD "HKCU\emptyKey" /f >nul
@REG SAVE "HKCU\emptyKey" empty.hiv /y >nul
@REG DELETE "HKCU\emptyKey" /f >nul
@REG RESTORE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%1" empty.hiv >nul
@del empty.hiv
@goto :eof
そのスクリプトを要約すると、assocコマンドを追加するための一種のラッパーです。
さて、それはそれを楽しんでいます:D
これは機能します:
Root: HKCR; Subkey: ".mpl"; ValueType: string; ValueName: ""; ValueData: "{#MyAppName}"; Flags: uninsdeletevalue
Root: HKCR; Subkey: ".tvd"; ValueType: string; ValueName: ""; ValueData: "{#MyAppName}"; Flags: uninsdeletevalue
Root: HKCR; Subkey: ".log"; ValueType: string; ValueName: ""; ValueData: "{#MyAppName}"; Flags: uninsdeletevalue
Root: HKCR; Subkey: "{#MyAppName}"; ValueType: string; ValueName: ""; ValueData: "MyView"; Flags: uninsdeletekey
Root: HKCR; Subkey: "{#MyAppName}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\delta.ico,0"
Root: HKCR; Subkey: "{#MyAppName}\Shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""