web-dev-qa-db-ja.com

InnoSetupでのファイルの関連付け

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""" 

協会が機能していない理由について何か提案はありますか?

17
user1429254

プログラムを拡張子に関連付けたい場合は、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=""も含まれているため、レジストリのデフォルト値を取得します。

add extension in registry

Root: HKCR; Subkey: "MyMAGIApplication"; ValueData: "Program MAGI"; ValueType: string; ValueName: ""; Flags: uninsdeletekeyHKCRにキー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を起動できます。

そしてレジストリの結果:

Add entry in KHCR\MyMAGIApplication

31
v20100v

ファイルの関連付けの作成については、以前SO)で回答されていますが、コアドキュメントでは次のように参照されています。

http://www.jrsoftware.org/isfaq.php#assoc

ファイルの関連付けの作成

まず、[Setup]セクションディレクティブChangesAssociationsyesに設定します。次に、以下に示すように[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は、そのタイプのファイルがエクスプローラーでダブルクリックされたときに実行するプログラムを指定するレジストリキーです。周囲の引用符はコマンドラインにあるため、長いファイル名を正しく処理します。

6
Andrew Truckle

Windowsファイルの関連付けを要約すると、次の3つの主要なレジストリ設定を処理する必要があります。

  1. HKCR MyMAGICApplication
    ->アプリへのパスとアイコン
  2. HKCR 。magi
    -> '関連付け。magi with MyMAGICApplication(システムデフォルト)
  3. HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.magi\UserChoice
    -> 'associate 。magi with MyMAGICApplication(ユーザーデフォルト)

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コマンドを追加するための一種のラッパーです。

  1. beforeInstallAssoc.datで以前の設定を保存/復元します
  2. リセット/削除(Explorer\FileExts)REGRESTOREを介して素敵になりますREGDELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts \%1\UserChoice"/f/va will作業。現在のユーザー設定を削除するだけで、システムの設定が使用されます。ただし、代わりにACCESS DENIED。を取得してください。愚かなWindowsは、バージョンが高いほど、よりビッチになります。したがって、あなたは自分の権利のために戦わなければなりません。REG RESTOREこれを克服するためのいくつかの回避策です。詳細については、スクリプトの最後にある:ResetUserFileExt関数を参照してください。

さて、それはそれを楽しんでいます:D

2
Nadu

これは機能します:

    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""" 
1
user1429254