Association de fichiers dans la configuration Inno

j'utilise Inno Setup et essaie d'associer un programme qui se trouve dans le Program Files (x86) dans Windows 7. J'ai le code suivant:

#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: "MyViewdelta.ico"; ValueType: string; ValueName: ""; ValueData: "{app}GeoView.EXE,0"
Root: HKCR; Subkey: "MyViewshellopencommand"; ValueType: string; ValueName: ""; ValueData: """{app}MYVIEW.EXE"" ""%1""" 

des suggestions sur les raisons pour lesquelles l'association ne fonctionne pas?

13
demandé sur Martin Prikryl 2014-10-23 23:37:34

4 réponses

si vous voulez associer un programme à une extension, ajoutez simplement cette instruction dans votre fichier iss:

Dans la section

[Setup]

ChangesAssociations = yes

^-Setu va dire à Explorer de rafraîchir les informations de ses associations de fichiers à la fin de l'installation, et Uninstall va faire de même à la fin de la désinstallation.

Et dans la section

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

Explications

Root: HKCR; Subkey: ".magi"; ValueData: "MyMAGIApplication"; ValueType: string; ValueName: ""; Flags: uninsdeletevalue. Cette instruction add ".mages" de la clé dans le registre, avec plus de précision dans HKEY_CLASSES_ROOT (HKCR). Dans cette instruction, nous avons aussi ValueName="" donc, c'obtenir la valeur par défaut dans le registre.

add extension in registry

Root: HKCR; Subkey: "MyMAGIApplication"; ValueData: "Program MAGI"; ValueType: string; ValueName: ""; Flags: uninsdeletekey pour ajouter la touche MyMAGIApplication en HKCR avec la valeur "Program MAGI".

Root: HKCR; Subkey: "MyMAGIApplication\DefaultIcon"; ValueData: "{app}\MAGI.EXE,0"; ValueType: string; ValueName: "" pour associer une icône contient, dans l'exécutable. "0" indique que c'est la première icône présente dans L'exécutable MAGI.EXE.

Root: HKCR; Subkey: "MyMAGIApplication\shell\open\command"; ValueData: """{app}\MAGI.EXE"" ""%1"""; ValueType: string; ValueName: "" pour ajouter la sous-clé shell\open\command. Avec cette instruction, Windows est en mesure de lancer application MAGI.EXE quand un utilisateur clique sur un fichier avec extension ".mage."

Et le résultat dans le registre :

Add entry in KHCR\MyMAGIApplication

24
répondu v20100v 2016-02-03 14:15:33

bien résumer L'association de fichiers Windows Il existe 3 principaux paramètres de registre:

  1. HKCR MyMAGICApplication

    -> chemin d'accès et l'icône app
  2. HKCR .mages

    -> 'associer .magesMyMAGICApplication (par défaut)
  3. HKCU\Software \ Microsoft\Windows\CurrentVersion\ Explorer\FileExts\.mages\UserChoice

    - >associer les .magesMyMAGICApplication (par défaut de l'Utilisateur)

Concernant 1. et 2. celles-ci entrent bien dans les réponses précédentes. (Sauf le point que .mages peuvent avoir été associé à disons Somotherothermagicapplication avant. Ce paramètre sera écrasé et n'est pas restaurée sur désinstaller.) Toutefois, pour le faire fonctionner pleinement en real 3. doit également pris en compte.

Ok ici nous avons nous allons commençant par 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: "" ;

alors que dire ici. Eh bien seulement 1. est déjà fait. 2.(et 3.) est fait en fonction si l'associé de tâche a été activé et son travail est fait en invoquant AssocBak.cmd

veuillez excuser l'utilisation de fichiers batch au lieu du code Inno Pascal ici / n'hésitez pas à mettre en œuvre. Cependant, tant que ça marche, je le garde.

@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

pour résumer ce script, c'est juste une sorte d'emballage pour le assoc commande ajouter

  1. sauvegarder / restaurer le paramètre précédent dans BeforeInstallAssoc.dat
  2. Réinitialise / supprime 3. (Explorer\FileExts) via REG RESTORE Serait sympa REG supprimer "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%1\UserChoice" / f / va serait de travailler. Il suffit de supprimer le paramètre utilisateur actuel pour que le système one soit utilisé. Mais au lieu de cela juste obtenir ACCÈS REFUSÉ.. Windows stupide plus la version est haute plus bitchier il obtient. Donc vous devez Vous battre pour vos droits. REG RESTORE est quelques solution pour remédier à cela. Voir le :ResetUserFileExt fonction à la fin du script pour plus de détails.

d'Accord que c'est profiter :D

2
répondu Nadu 2015-12-05 01:58:42

créer des associations de fichiers a déjà été répondu sur SO. Mais la documentation de base s'y réfère:

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

Création D'Associations De Fichiers

tout d'Abord définir l' [Setup] la directive ChangesAssociationsyes. Puis créer [Registry] entrées comme indiqué ci-dessous.

[Registry]
Root: HKCR; Subkey: ".myp"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue

.myp est l'extension que nous associons. MyProgramFile c'est la nom du type de fichier stocké dans le registre. Assurez-vous d'utiliser un nom unique pour cela afin de ne pas écraser par inadvertance la clé de registre d'une autre application.

Root: HKCR; Subkey: "MyProgramFile"; ValueType: string; ValueName: ""; ValueData: "My Program File"; Flags: uninsdeletekey

My Program File ci-dessus est le nom pour le type de fichier comme indiqué dans l'Explorateur.

Root: HKCR; Subkey: "MyProgramFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\MYPROG.EXE,0"

DefaultIcon est la clé de registre qui spécifie le nom du fichier contenant l'icône à associer le type du fichier. ,0 indique à Explorer d'utiliser la première icône de MYPROG.EXE. (,1 signifierait la deuxième icône.)

Root: HKCR; Subkey: "MyProgramFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\MYPROG.EXE"" ""%1"""

shell\open\command est la clé de registre qui indique le programme à exécuter lorsqu'un fichier de type double-clic dans l'Explorateur. Les guillemets environnants se trouvent dans la ligne de commande, ce qui permet de gérer correctement les noms de fichiers longs.

2
répondu Andrew Truckle 2018-07-03 11:18:09

cela fonctionne:

    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""" 
0
répondu user1429254 2014-10-23 21:32:29