Изменение файловых ассоциаций NSIS в Windows 7

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

Я прочитал несколько предложений о том, как этого добиться, так что currentky это то, что у меня есть в моем сценарии 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 ответ

Решение

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

Потому что люди заставляли это в прошлом, 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, которое переопределяет значение по умолчанию.

Другие вопросы по тегам