Когда то рассматривалось,
как определять дефолтовое приложение (путь и имя) для открытия определённых типов файлов с помошью функции FindExecutable.
Ту же операцию можно сделать немного проще с помощью функции
AssocQueryString.
Код:
![Выделить весь код](images/misc/selectcode.png)
!define ASSOCSTR_EXECUTABLE 2
!define ASSOCF_NOTRUNCATE 0x00000020
!define ASSOCF_REMAPRUNDLL 0x00000080
!define ASSOCF_NOFIXUPS 0x00000100
System::Call 'SHLWAPI::AssocQueryString(i ${ASSOCF_NOTRUNCATE}|${ASSOCF_REMAPRUNDLL}|${ASSOCF_NOFIXUPS}, i ${ASSOCSTR_EXECUTABLE}, t ".html", t "open", t.r1, *i ${NSIS_MAX_STRLEN})i.r0'
MessageBox MB_OK "EXECUTABLE $1"
Оба эти способа нормально работают в Windows 7, но к сожалению , не в Windows 10...
Используя AssocQueryString , в Windows 10,
для штатных интегрированных приложений получаем - C:\Windows\system32\LaunchWinApp.exe
Возможно это связано с особенностями работы собственных приложений в новой ОС...
Для автономно установленных приложений (например, для Хрома и т.д. ) - всё нормально.
Как крайний выход из положения, в Windows 10 можно получить
только имя дефолтового приложения, если использовать константу ASSOCSTR_FRIENDLYAPPNAME
Код:
![Выделить весь код](images/misc/selectcode.png)
!define ASSOCSTR_FRIENDLYAPPNAME 4
System::Call 'SHLWAPI::AssocQueryString(i ${ASSOCF_NOTRUNCATE}|${ASSOCF_REMAPRUNDLL}|${ASSOCF_NOFIXUPS}, i ${ASSOCSTR_FRIENDLYAPPNAME}, t ".htm", t "open", t.r1, *i ${NSIS_MAX_STRLEN})i.r0'
MessageBox MB_OK "FRIENDLYAPPNAME $1"