Подтвердить что ты не робот

Ассоциация файлов настроек inno

Я использую Inno Setup и пытаюсь связать программу, которая находится в программных файлах (x86) в Windows 7. У меня есть следующее:

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

Любые предложения о том, почему ассоциация не работает?

4b9b3361

Ответ 1

Если вы хотите связать программу с расширением, просто добавьте эту инструкцию в ваш файл iss:

В разделе

[Setup]

ChangesAssociations = yes

^ - Программа установки сообщит обозревателю об обновлении информации об ассоциациях файлов в конце установки, а Uninstall сделает то же самое в конце удаления.

А в разделе

[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: uninsdeletekey Чтобы добавить ключ MyMAGIApplication в HKCR со значением "Program MAGI".

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: "" Чтобы добавить команду оболочки\открыть\команду. С помощью этой инструкции Windows может запустить приложение MAGI.EXE, когда пользователь нажимает на файл с расширением ".magi".

И результат в реестре:

Add entry in KHCR\MyMAGIApplication

Ответ 2

Хорошо суммировать ассоциацию файлов Windows Существует 3 основных параметра реестра:

  • HKCR MyMAGICApplication
    → путь и значок для приложения
  • HKCR .magi
    → 'связать .magi с MyMAGICApplication (по умолчанию для системы)
  • HKCU\Software\Microsoft\Windows\CurrentVersion\ Проводник \FileExts \.magi\UserChoice
    → 'связать .magi с 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.) выполняется в зависимости от того, включен ли помощник Task, и его работа выполняется путем вызова команды AssocBak.cmd

Пожалуйста, извините за использование пакетных файлов вместо кода Inno Pascal здесь/не стесняйтесь реализовать. Однако, пока он работает, я держу его.

@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

для сводок, которые script, его просто своего рода оболочка для команды assoc, добавляющей

  • сохранить/восстановить предыдущие настройки в BeforeInstallAssoc.dat
  • Сбрасывает/удаляет 3. (Explorer\FileExts) через REG RESTORE Было бы здорово REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%1\UserChoice" /f/va должно сработать. Просто удалите текущий пользовательский параметр, чтобы система использовалась. Но вместо этого просто получите ACCESS DENIED.. Глупые Windows, тем выше версия, тем более она более сильная. Итак, Вы должны бороться за свои права. REG RESTORE - это некоторое решение для преодоления этого. Подробнее см. В функции : ResetUserFileExt в конце script.

Хорошо, что ему нравится: D

Ответ 3

Это работает:

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