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?
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.
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 :
bien résumer L'association de fichiers Windows Il existe 3 principaux paramètres de registre:
- HKCR MyMAGICApplication
-> chemin d'accès et l'icône app - HKCR .mages
-> 'associer .magesMyMAGICApplication (par défaut) - 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
- sauvegarder / restaurer le paramètre précédent dans BeforeInstallAssoc.dat
- 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
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 directiveChangesAssociations
yes
. 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 deMYPROG.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.
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"""