总结一下Windows文件关联
有 3 个主要的注册表设置需要处理:
- HKCR MyMAGICApplication
-> 应用程序的路径和图标
- HKCR .magi
-> '将 .magi 与 MyMAGICApplication 关联(系统默认)
- HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\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 associate 是否已启用并且其工作是通过调用 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
总结该脚本,它只是 assoc 命令添加的一种包装
- 在 BeforeInstallAssoc.dat 中保存/恢复之前的设置
- 通过 REG RESTORE 重置/删除 3. (Explorer\FileExts)
会好的
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\%1\UserChoice" /f /va
会工作。只需删除当前用户设置,以便使用系统设置。但只是得到 ACCESS DENIED.。愚蠢的 Windows 版本越高,它就越卑鄙。所以你必须为自己的权利而战。
REG RESTORE 是解决此问题的一些解决方法。有关详细信息,请参阅脚本末尾的 :ResetUserFileExt 函数。
好的,就是这样:D