Переход к разделу в файле справки CHM без открытия другого окна

#inno-setup #chm #shellexecute #html-help

#inno-setup #chm #shellexecute #html-справка

Вопрос:

Я включаю сокращенную справку CHM по программе установки и хочу, чтобы кнопка справки на каждой странице мастера установки вызывала другую страницу справки. Если я открою окно справки с одной страницы мастера установки, выполнив команду hh.exe -mapid 1234 MyAppCutDownHelp.chm , это работает нормально, но если я сделаю то же самое позже с другой страницы мастера с помощью hh.exe -mapid 5678 MyAppCutDownHelp.chm , я получу этот раздел в порядке, но с другим экземпляром HH.Запускается EXE, и затем у меня есть два окна справки, одно с разделом 1234 и одно с разделом 5678.

Я хотел бы, чтобы первый вызов HH.exe открыть окно справки CHM и с этого момента отображать последующие разделы справки в окне справки sane из установщика.

Я не верю, что у меня есть доступ к тому же HTML help API из Inno Setup scripting Pascal, который я обычно имею из Delphi.

В настоящее время я запускаю механизм справки с

 ShellExecAsOriginalUser ('open', ExpandConstant ('{tmp}MyAppCutDownHelp.chm'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode) ;
  

но я полагаю, что это просто вызывает HH.exe .

Обновление Вот моя последняя попытка, основанная на ответе @Robert:

 ; -- Help Test.iss --

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}My Program"; Filename: "{app}MyProg.exe"

[Code]

const
 HH_DISPLAY_TOPIC = 0;
 HH_DISPLAY_TOC =1;
 HH_DISPLAY_INDEX =2;
 HH_HELP_CONTEXT = 15;

function HtmlHelpA (hWndCaller: HWND; pszFile: PAnsiChar; uCommand: UINT; dwData: DWORD): HWnd; 
  external 'HtmlHelpA@hhctrl.ocx stdcall';

function HtmlHelp(hWndCaller: HWND; pszFile: String; uCommand: UINT; dwData: DWORD): HWnd; 
begin
  try
    result := HtmlHelpA(hWndCaller,pszFile,uCommand,dwData);
  except
     MsgBox('Unable To Display Help file.', mbError, MB_OK);    
  end;
end;


function InitializeSetup : Boolean;
begin
  HtmlHelp(0,'MyProg.chm',HH_DISPLAY_TOC,0);
  result := true;

end;
  

Комментарии:

1. Используя ваш код, я ничего не получаю. Не удается найти ‘Myprog.chm’. Однако я не получаю сообщение об ошибке.

Ответ №1:

Вы можете использовать функцию HtmlHelpA or HtmlHelpW в hhctrl.ocx

Это задокументировано в MSDN.

 ; -- Example1.iss --
; Demonstrates copying 3 files and creating an icon.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}My Program"; Filename: "{app}MyProg.exe"

[Code]
const
 HH_DISPLAY_TOPIC = 0;
 HH_DISPLAY_TOC =1;
 HH_DISPLAY_INDEX =2;
 HH_HELP_CONTEXT = 15;

function HtmlHelpA (hWndCaller: HWND; pszFile: PAnsiChar; uCommand: UINT; dwData: DWORD): HWnd; 
  external 'HtmlHelpA@hhctrl.ocx stdcall';

function HtmlHelp(hWndCaller: HWND; pszFile: String; uCommand: UINT; dwData: DWORD): HWnd; 
begin
  try
    result := HtmlHelpA(hWndCaller,pszFile,uCommand,dwData);
  except
     MsgBox('Unable To Display Help file.', mbError, MB_OK);    
  end;
end;


function InitializeSetup : Boolean;
begin
  HtmlHelp(0,'C:Program Files (x86)Inno Setup 5ISetup.chm',HH_DISPLAY_TOC,0);
  result := true;
end;
  

Комментарии:

1. Отлично @Robert. Именно то, что я хотел.

2. @Robert aarrgghh не так быстро… Я получаю ошибку 0xc0000005 в hhctrl.ocx — попытка .. except даже не распознает ее — она переходит прямо в диалоговое окно MS «xxx столкнулся с ошибкой».

3. Как вы вызываете функцию? В опубликованном мной примере это работает, я никогда раньше этого не делал, просто написал пример на основе документации, так что, возможно, мне тоже есть чему поучиться здесь.

4. @rossmcm, ты должен добавить свой код к своему вопросу , а не к ответу @Robert’s.

5. @sarnold — хорошо подмечено — я допустил осечку

Ответ №2:

Это намного проще, ИМХО:

 Filename: "{win}hh.exe"; 
    Parameters: "{app}MeetSchedAssist.chm::/msa-revision-history.htm"; 
    WorkingDir: "{app}"; 
    Flags: nowait postinstall runmaximized; 
    Description: "{cm:ViewChangeHistory}"
  

Нет необходимости во всем этом коде. Просто вызовите файл CHM с помощью hh.exe .

Комментарии:

1. Я не думаю, что это соответствует требованию «без открытия другого окна» , или нет?

2. @DocBrown Не знаю! Я написал этот ответ 4 года назад.