我可以通过传递一个ShortInteger并将其作为dwData参数的Word转换来打开一个CHM文件。即。
Unit Help; //this is where the Id's are set with their description
Interface
Const
Address_File = 35; //delphi identifies Address_File as a shortint
etc..
致电获取帮助通过我的身份证件
GetHelp(Address_File); //call get help pass my ID to open to the Address_File topic
GetHelp程序
procedure GetHelp(HelpID : Word);
begin
Application.HelpFile := ProgramPath + 'help.chm';
HtmlHelpW(0, PWideChar(Application.HelpFile),HH_HELP_CONTEXT , HelpID);
end;
HtmlHelpW函数
function HtmlHelpW(hwndCaller : HWND; pszFile: PWideChar; uCommand : Integer;
dwData : DWORD) : HWND; stdcall; external 'hhctrl.ocx' name 'HtmlHelpW';
当我传递不同的ShortIntegers时,我能够在不同的部分初始化帮助文件。 但是我无法弄清楚值是如何映射的。 chm文件中有一些我希望能够映射到的部分,但是与它们关联的短整数或上下文ID没有记录在程序中或者没有映射。
答案 0 :(得分:6)
Free Pascal附带了一个chmls.exe工具,它有一个试图恢复别名(上下文)数据的命令:
chmls, a CHM utility. (c) 2010 Free Pascal core.
Usage: chmls [switches] [command] [command specific parameters]
Switches :
-h, --help : this screen
-p, --no-page : do not page list output
-n,--name-only : only show "name" column in list output
Where command is one of the following or if omitted, equal to LIST.
list <filename> [section number]
Shows contents of the archive's directory
extract <chm filename> <filename to extract> [saveasname]
Extracts file "filename to get" from archive "filename",
and, if specified, saves it to [saveasname]
extractall <chm filename> [directory]
Extracts all files from archive "filename" to directory
"directory"
unblockchm <filespec1> [filespec2] ..
Mass unblocks (XPsp2+) the relevant CHMs. Multiple files
and wildcards allowed
extractalias <chmfilename> [basefilename] [symbolprefix]
Extracts context info from file "chmfilename"
to a "basefilename".h and "basefilename".ali,
using symbols "symbolprefix"contextnr
extracttoc <chmfilename> [filename]
Extracts the toc (mainly to check binary TOC)
extractindex <chmfilename> [filename]
Extracts the index (mainly to check binary index)
这可能是一个开始,因为至少你会知道哪些页面是使用ID导出的,也许URL名称会提供一些信息。
util在最近的版本中(确保你得到2.6.0)并且也可以在Free Pascal源代码中使用,它应该可以通过相对较小的努力转换为Delphi。
基本上chmls工具是由各种测试代码库创建的。测试程序反编译并打印不同CHM部分的内容,并在创建帮助文件编译器chmcmd时使用,该编译器也是FPC的一部分。
答案 1 :(得分:2)
在Delphi中,调用帮助文件非常简单。在任何VCL Forms应用程序中,您可以将几乎任何控件的HelpContext
属性设置为唯一的Context ID,该ID对应于帮助文件中的特定主题。帮助文件是使用这些映射编译的,但是当您对其进行反编译时,这些映射不再存在。您必须有权访问原始帮助文件项目才能知道这些ID。
HelpContext
设置为帮助文件中的相应上下文ID HelpType
控件设置为htContext
以使用HelpContext
ID Application.HelpFile
分配到CHM文件的相应位置F1
时,将根据控件上的帮助上下文ID或其父控件打开帮助文件如果您没有原始项目,并且您不想重新创建它,那么您将有一个很长的任务,即迭代您的帮助文件的Context ID。尝试调用帮助文件,从0到1,000或可能是50,000,具体取决于它的大小。
我实现的实践是一个名为HelpConstants.pas
的指定单元中的一组常量,它们在我们的公共应用程序库中共享。每个常量名称唯一且简要地描述了它所代表的主题。在启动应用程序时,我会动态地将这些Context ID分配给它们相应的控件(通常是表单),VCL负责其余的操作。
答案 2 :(得分:1)
我得到了Marco建议的实用程序 https://github.com/alrieckert/freepascal_arm/blob/master/packages/chm/bin/i386-win32/chmls.exe (通过选择View Raw下载)。 我能够从.chm帮助文件中提取所有上下文标记,并通过调用Application-&gt; HelpJump()将我感兴趣的标记添加到我的C ++ Builder程序中。 HTH