Изменение файловых ассоциаций NSIS в Windows 7 - PullRequest
0 голосов
/ 25 июня 2018

У меня есть требование (принудительно) изменить сопоставление файлов для определенного типа файлов (расширение ".theext"), чтобы открывать его с помощью "myapp.exe" при установке приложения с помощью NSIS.

Я прочитал несколько предложений о том, как этого добиться, так что в настоящее время это то, что у меня есть в моем сценарии NSIS:

DeleteRegKey HKCR ".theext" 
DeleteRegKey HKLM ".theext" 
DeleteRegKey HKCU ".theext" 

WriteRegStr HKCR ".theext" "" "theextfile"

WriteRegStr HKCR "theextfile" "" "My App Document"

WriteRegStr HKCR "theextfile\DefaultIcon" "" "$INSTDIR\${EXENAME}.exe,0"

WriteRegStr HKCR "theextfile\shell\open\command" "" '"$INSTDIR\${EXENAME}.exe" "%1"'

WriteRegStr HKCR "theextfile\shell\print\command" "" '"$INSTDIR\${EXENAME}.exe" /p "%1"'

WriteRegStr HKLM "Software\RegisteredApplications" "${EXENAME}" "$INSTDIR\${EXENAME}.exe"

WriteRegStr HKCU "Software\RegisteredApplications" "${EXENAME}" "$INSTDIR\${EXENAME}.exe"



WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.theext\OpenWithList" "a" "$INSTDIR\${EXENAME}.exe"   

Чтобы проверить это, я установил привязку файла с помощью WIndows 7 Explorer к GVIM.exe.

После этого при каждом запуске установщика Windows 7 по-прежнему открывает файл двойным щелчком, используя GVim, а не «MyApp.exe».

Но когда я проверяю файл ассоциации следующим образом, все кажется нормальным:

ftype | findstr /i theext

Дает:

theextfile="C:\Program File (x86)\My App\myapp.exe" "%1"

1 Ответ

0 голосов
/ 25 июня 2018

Вы делаете все, что должны, и если расширение еще не зарегистрировано кем-то другим, вы станете по умолчанию.Вы не должны сначала удалять старые ключи (это может испортить систему, но это никогда не поможет вам стать по умолчанию).Принудительное принуждение к чему-либо является злом, пользователь, как предполагается, контролирует ситуацию.

Поскольку люди заставляли это в прошлом, Microsoft стала усложнять изменение по умолчанию.Недокументированный ключ FileExts хранит выбранных по умолчанию пользователей в субключах UserChoice.В более новых версиях Windows (8+?) Значение по умолчанию проверяется с помощью некоторого секретного хэша , поэтому вы не можете переопределить его.

Интерфейс IApplicationAssociationRegistration не работает в более новой версии Windows, ноон может работать в Windows 7:

!include Win\COM.nsh
!include WinCore.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistration} ${IID_IApplicationAssociationRegistration} r0 ""
${If} $0 P<> 0
    ${IApplicationAssociationRegistration::SetAppAsDefault} $0 '("MyApp", ".myext", ${AT_FILEEXTENSION})'
    ${IUnknown::Release} $0 ""
${EndIf}

В Windows 8 все, что вы можете сделать, это запустить общий пользовательский интерфейс:

!include Win\COM.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistrationUI} ${IID_IApplicationAssociationRegistrationUI} r0 ""
${If} $0 P<> 0
    ${IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI} $0 '("Wordpad")' ; Replace with your name from the RegisteredApplications key
    ${IUnknown::Release} $0 ""
${EndIf}

В Windows 10 даже если этого не произошло, он просто отобразиттост, сообщающий пользователю об изменении их настроек при вызове LaunchAdvancedAssociationUI.

ftype не знает истинного значения по умолчанию, значение по умолчанию известно только тогда, когда Windows фактически выполняет код ассоциации в оболочке.IApplicationAssociationRegistration::QueryCurrentDefault лучше угадать по умолчанию, но даже он может потерпеть неудачу, если по умолчанию это расширение оболочки COM, которое переопределяет значение по умолчанию.

...