Inno Setup - Зарегистрируйтесь как для 32-разрядной, так и для 64-разрядной версии - PullRequest
1 голос
/ 07 мая 2020

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

; Register File Types 32 bit
Root: HKCR; SubKey: ".mwb"; ValueType: string; ValueData: "MeetingScheduleAssistant.MeetingWorkBook"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook"; ValueType: string; ValueData: "Meeting Workbook"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook\Shell\Open\Command"; ValueType: string; ValueData: """{app}\MeetSchedAssist.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetingScheduleAssistant.MeetingWorkBook\DefaultIcon"; ValueType: string; ValueData: "{app}\MeetSchedAssist.exe,0"; Flags: uninsdeletevalue

Root: HKCR; SubKey: ".srr"; ValueType: string; ValueData: "MeetingScheduleAssistant.SoundRotaReport"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.SoundRotaReport"; ValueType: string; ValueData: "Sound Rota Report"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.SoundRotaReport\Shell\Open\Command"; ValueType: string; ValueData: """{app}\MeetSchedAssist.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetingScheduleAssistant.SoundRotaReport\DefaultIcon"; ValueType: string; ValueData: "{app},1"; Flags: uninsdeletevalue

Мой установщик поставляется с указанным выше 32-битным exe, но он также имеет исполняемый файл _64x. Как правильно зарегистрироваться в обеих средах? Я просто продублирую код, например:

; Register File Types 32 bit
Root: HKCR; SubKey: ".mwb"; ValueType: string; ValueData: "MeetingScheduleAssistant.MeetingWorkBook32"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook32"; ValueType: string; ValueData: "Meeting Workbook"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook32\Shell\Open\Command"; ValueType: string; ValueData: """{app}\MeetSchedAssist.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetingScheduleAssistant.MeetingWorkBook32\DefaultIcon"; ValueType: string; ValueData: "{app}\MeetSchedAssist.exe,0"; Flags: uninsdeletevalue

Root: HKCR; SubKey: ".srr"; ValueType: string; ValueData: "MeetingScheduleAssistant.SoundRotaReport32"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.SoundRotaReport32"; ValueType: string; ValueData: "Sound Rota Report"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.SoundRotaReport32\Shell\Open\Command"; ValueType: string; ValueData: """{app}\MeetSchedAssist.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetingScheduleAssistant.SoundRotaReport32\DefaultIcon"; ValueType: string; ValueData: "{app},0"; Flags: uninsdeletevalue

; Register File Types 64 bit
Root: HKCR; SubKey: ".mwb"; ValueType: string; ValueData: "MeetingScheduleAssistant.MeetingWorkBook64"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook64"; ValueType: string; ValueData: "Meeting Workbook"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook64\Shell\Open\Command"; ValueType: string; ValueData: """{app}\MeetSchedAssist_x64.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetingScheduleAssistant.MeetingWorkBook64\DefaultIcon"; ValueType: string; ValueData: "{app}\MeetSchedAssist_x64.exe,0"; Flags: uninsdeletevalue

Root: HKCR; SubKey: ".srr"; ValueType: string; ValueData: "MeetingScheduleAssistant.SoundRotaReport64"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.SoundRotaReport64"; ValueType: string; ValueData: "Sound Rota Report"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetingScheduleAssistant.SoundRotaReport64\Shell\Open\Command"; ValueType: string; ValueData: """{app}\MeetSchedAssist_x64.exe"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetingScheduleAssistant.SoundRotaReport64\DefaultIcon"; ValueType: string; ValueData: "{app}\MeetSchedAssist_x64.exe,0"; Flags: uninsdeletevalue

Я не вижу, как это будет работать, потому что пользователь дважды щелкает файл, поэтому как он узнает, какой из файлов exe использовать?

1 Ответ

2 голосов
/ 08 мая 2020

Если вы используете современный метод регистрации ассоциаций, вы можете зарегистрировать несколько приложений (как 32-битные, так и 64-битные версии вашего приложения). Затем система предложит пользователю выбрать, какое приложение использовать, когда пользователь впервые попытается открыть файл соответствующего типа. Кроме того, пользователь сможет изменить решение в Панели управления (или в приложении Windows 10 Настройки).

См. Inno Setup: Расширение Windows списка приложений по умолчанию

Вам придется повторить всю регистрацию для обеих версий (с уникальными идентификаторами как для программного обеспечения, так и для ассоциаций). Вы можете использовать препроцессор , чтобы не повторять код.

Для этого требуется Windows Vista как минимум.


Если вы хотите придерживаться своего пути чтобы зарегистрировать приложение (или если вам нужна поддержка более старых версий Windows), вам нужно будет зарегистрировать только одну версию вашего приложения. Либо в соответствии с разрядностью системы, либо в соответствии с предпочтениями пользователя.

Вы можете использовать константу сценария в разделе [Registry] :

[Registry]
...
Root: HKCR; SubKey: "MeetingScheduleAssistant.MeetingWorkBook32\Shell\Open\Command"; \
    ValueType: string; ValueData: """{app}\{code:GetExecutableToRegister}"" ""%1"""; \
    Flags: uninsdeletekey
...

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

[Code]
function GetExecutableToRegister(Param: string): string;
begin
  if IsWin64 then
    Result := 'MeetSchedAssist_x64.exe'
  else
    Result := 'MeetSchedAssist.exe';
end;

Чтобы выбрать исполняемый файл в соответствии с предпочтениями пользователя, вы можете использовать [Tasks] и WizardIsTaskSelected функция :

[Tasks]
Name: register32; Description: "Register 32-bit executable"; Check: IsWin64; \
    flags: unchecked;
Name: register64; Description: "Register 64-bit executable"; Check: IsWin64 
[Code]
function GetExecutableToRegister(Param: string): string;
begin
  if IsWin64 and WizardIsTaskSelected('register64') then
    Result := 'MeetSchedAssist_x64.exe'
  else
    Result := 'MeetSchedAssist.exe';
end;

(не проверено)


Обновление по OP:
Этот код, который мне удалось заставить работать:

; Register File Types
Root: HKCR; SubKey: ".mwb"; ValueType: string; ValueData: "MeetSchedAssist.MWB"; Flags: uninsdeletekey
Root: HKCR; SubKey: ".srr"; ValueType: string; ValueData: "MeetSchedAssist.SRR"; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetSchedAssist.MWB"; ValueType: string; ValueData: "Meeting Workbook Schedule"; Flags: uninsdeletekey
Root: HKCR; Subkey: "MeetSchedAssist.SRR"; ValueType: string; ValueData: "Sound Rota Report"; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetSchedAssist.MWB\Shell\Open\Command"; ValueType: string; ValueData: """{app}\{code:GetExecutableToRegister}"" ""%1"""; Flags: uninsdeletekey
Root: HKCR; SubKey: "MeetSchedAssist.SRR\Shell\Open\Command"; ValueType: string; ValueData: """{app}\{code:GetExecutableToRegister}"" ""%1"""; Flags: uninsdeletekey

В приведенном выше коде используется Tasks. Хотя у меня по задачам отдельный вопрос, и "Рабочий стол" почему-то не обновлял sh. Но вышеперечисленное работает. Не удается использовать новую систему.

...