原创: 自己收集整理的 DELPHI 中控制与使用HMTL帮助文件的单元代码。

作者: 陆岛工作室

在程序里加帮助文件,是常用的方法,我一直使用以下这个单元,不过 DELPHI2007好像对HTML帮助文件的支持有所改善。但没试过,因为自己整理使用的这个单元一直很好用。所以常得有用(对使用DELPH的朋友)。所以贴出来了。

主要有以下几个函数,

//取帮助文件名
function HelpFileName: String;
//根据 ContextId 调用帮助
function ShowHelpContext(ContextId: DWord): Integer;
//根据检索字符调用帮助
function ShowHelpTopic(Topic: String): Integer;
//显示主帮助窗口
function ShowHelpWindow: Integer;
//显示主帮助窗口的索引栏
function ShowHelpIndex: Integer;
//显示主帮助窗口的搜索栏
function ShowHelpSearch: Integer;
//设置主帮助文件名
procedure SetHelpFileName(FileName: String);

例如在主程序的菜单-->帮助 中的 OnClick 事件里添加以下代码:

procedure miHelpClick(Sender: TObject);
begin
  ShowHelpWindow; //显示主帮助窗口
end;

或者在相关的控件里的帮助事件中加入

ShowHelpContext(10992); //10992 是该控件的帮助ID, 可以为任意自己定义的ID.

ShowHelpTopic('使用说明'); //'使用说明'是该控件的帮助索引, 可以为任意自己定义的字符.

代码源文件如下:

{*******************************************************************************

   XOtecExpress Visual Component Library [陆岛工作室]
   Copyright (c) 2008 XOtec Studio.  [PengJunli]

   By: PengJunLi Build: 2008-05
   E-mail: iinsnian@126.com  XOtec@vip.QQ.com  QQ:442801172

*******************************************************************************
}

unit xtHTMLHelp;

interface

(*$HPPEMIT ''*)
(*$HPPEMIT '#include "htmlhelp.h"'*)
(*$HPPEMIT ''*)
(*$HPPEMIT 'typedef struct tagHH_LAST_ERROR'*)
(*$HPPEMIT '{'*)
(*$HPPEMIT '  int     cbStruct ;'*)
(*$HPPEMIT '  HRESULT hr ;'*)
(*$HPPEMIT '  BSTR    description ;'*)
(*$HPPEMIT '} HH_LAST_ERROR ;'*)
(*$HPPEMIT ''*)

uses Classes, Windows, Sysutils, Forms, Dialogs;

{$DEFINE HTMLHELP12}

type
{$IFDEF HTMLHELP12}
{$IFNDEF _WIN64}
  DWORD_PTR 
= DWORD;
{$ENDIF}
{$ENDIF}
  PCSTR 
= LPCSTR;

// Commands to pass to HtmlHelp()

const
  HH_DISPLAY_TOPIC           
= $0000;
  
{$EXTERNALSYM HH_DISPLAY_TOPIC}
  HH_HELP_FINDER             
= $0000;      // WinHelp equivalent
  
{$EXTERNALSYM HH_HELP_FINDER}
  HH_DISPLAY_TOC             
= $0001;      // not currently implemented
  
{$EXTERNALSYM HH_DISPLAY_TOC}
  HH_DISPLAY_INDEX           
= $0002;      // not currently implemented
  
{$EXTERNALSYM HH_DISPLAY_INDEX}
  HH_DISPLAY_SEARCH          
= $0003;      // not currently implemented
  
{$EXTERNALSYM HH_DISPLAY_SEARCH}
  HH_SET_WIN_TYPE            
= $0004;
  
{$EXTERNALSYM HH_SET_WIN_TYPE}
  HH_GET_WIN_TYPE            
= $0005;
  
{$EXTERNALSYM HH_GET_WIN_TYPE}
  HH_GET_WIN_HANDLE          
= $0006;
  
{$EXTERNALSYM HH_GET_WIN_HANDLE}
  HH_ENUM_INFO_TYPE          
= $0007;      // Get Info type name, call repeatedly to enumerate, -1 at end
  
{$EXTERNALSYM HH_ENUM_INFO_TYPE}
  HH_SET_INFO_TYPE           
= $0008;      // Add Info type to filter.
  
{$EXTERNALSYM HH_SET_INFO_TYPE}
  HH_SYNC                    
= $0009;
  
{$EXTERNALSYM HH_SYNC}
{$IFDEF HTMLHELP11}
  HH_ADD_NAV_UI              
= $000A;      // not currently implemented
  
{$EXTERNALSYM HH_ADD_NAV_UI}
  HH_ADD_BUTTON              
= $000B;      // not currently implemented
  
{$EXTERNALSYM HH_ADD_BUTTON}
  HH_GETBROWSER_APP          
= $000C;      // not currently implemented
  
{$EXTERNALSYM HH_GETBROWSER_APP}
{$ENDIF}
{$IFDEF HTMLHELP12}
  HH_RESERVED1               
= $000A;
  
{$EXTERNALSYM HH_RESERVED1}
  HH_RESERVED2               
= $000B;
  
{$EXTERNALSYM HH_RESERVED2}
  HH_RESERVED3               
= $000C;
  
{$EXTERNALSYM HH_RESERVED3}
{$ENDIF}
  HH_KEYWORD_LOOKUP          
= $000D;
  
{$EXTERNALSYM HH_KEYWORD_LOOKUP}
  HH_DISPLAY_TEXT_POPUP      
= $000E;      // display string resource id or text in a popup window
  
{$EXTERNALSYM HH_DISPLAY_TEXT_POPUP}
  HH_HELP_CONTEXT            
= $000F;      // display mapped numeric value in dwData
  
{$EXTERNALSYM HH_HELP_CONTEXT}
  HH_TP_HELP_CONTEXTMENU     
= $0010;      // text popup help, same as WinHelp HELP_CONTEXTMENU
  
{$EXTERNALSYM HH_TP_HELP_CONTEXTMENU}
  HH_TP_HELP_WM_HELP         
= $0011;      // text popup help, same as WinHelp HELP_WM_HELP
  
{$EXTERNALSYM HH_TP_HELP_WM_HELP}
  HH_CLOSE_ALL               
= $0012;      // close all windows opened directly or indirectly by the caller
  
{$EXTERNALSYM HH_CLOSE_ALL}
  HH_ALINK_LOOKUP            
= $0013;      // ALink version of HH_KEYWORD_LOOKUP
  
{$EXTERNALSYM HH_ALINK_LOOKUP}
  HH_GET_LAST_ERROR          
= $0014;      // not currently implemented, See HHERROR.h
  
{$EXTERNALSYM HH_GET_LAST_ERROR}
  HH_ENUM_CATEGORY           
= $0015;         // Get category name, call repeatedly to enumerate, -1 at end
  
{$EXTERNALSYM HH_ENUM_CATEGORY}
  HH_ENUM_CATEGORY_IT        
= $0016;      // Get category info type members, call repeatedly to enumerate, -1 at end
  
{$EXTERNALSYM HH_ENUM_CATEGORY_IT}
  HH_RESET_IT_FILTER         
= $0017;      // Clear the info type filter of all info types.
  
{$EXTERNALSYM HH_RESET_IT_FILTER}
  HH_SET_INCLUSIVE_FILTER    
= $0018;      // set inclusive filtering method for untyped topics to be included in display
  
{$EXTERNALSYM HH_SET_INCLUSIVE_FILTER}
  HH_SET_EXCLUSIVE_FILTER    
= $0019;      // set exclusive filtering method for untyped topics to be excluded from display
  
{$EXTERNALSYM HH_SET_EXCLUSIVE_FILTER}
{$IFDEF HTMLHELP11}
  HH_SET_GUID                
= $001A;      // For Microsoft Installer -- dwData is a pointer to the GUID string
  
{$EXTERNALSYM HH_SET_GUID}
{$ENDIF}
{$IFDEF HTMLHELP12}
  HH_INITIALIZE              
= $001C;      // Initializes the help system.
  
{$EXTERNALSYM HH_INITIALIZE}
  HH_UNINITIALIZE            
= $001D;      // Uninitializes the help system.
  
{$EXTERNALSYM HH_UNINITIALIZE}
  HH_PRETRANSLATEMESSAGE     
= $00FD;      // Pumps messages. (NULL, NULL, MSG*).
  
{$EXTERNALSYM HH_PRETRANSLATEMESSAGE}
  HH_SET_GLOBAL_PROPERTY     
= $00FC;      // Set a global property. (NULL, NULL, HH_GPROP)
  
{$EXTERNALSYM HH_SET_GLOBAL_PROPERTY}
{$ENDIF}

{$IFDEF HTMLHELP11}
  HH_INTERNAL                
= $00FF;      // Used internally.
  
{$EXTERNALSYM HH_INTERNAL}
{$ENDIF}

{$IFDEF HTMLHELP12}
  HHWIN_PROP_TAB_AUTOHIDESHOW 
= (1 shl 0); // Automatically hide/show tri-pane window
  
{$EXTERNALSYM HHWIN_PROP_TAB_AUTOHIDESHOW}
{$ENDIF}
  HHWIN_PROP_ONTOP           
= (1 shl 1);  // Top-most window (not currently implemented)
  
{$EXTERNALSYM HHWIN_PROP_ONTOP}
  HHWIN_PROP_NOTITLEBAR      
= (1 shl 2);  // no title bar
  
{$EXTERNALSYM HHWIN_PROP_NOTITLEBAR}
  HHWIN_PROP_NODEF_STYLES    
= (1 shl 3);  // no default window styles (only HH_WINTYPE.dwStyles)
  
{$EXTERNALSYM HHWIN_PROP_NODEF_STYLES}
  HHWIN_PROP_NODEF_EXSTYLES  
= (1 shl 4);  // no default extended window styles (only HH_WINTYPE.dwExStyles)
  
{$EXTERNALSYM HHWIN_PROP_NODEF_EXSTYLES}
  HHWIN_PROP_TRI_PANE        
= (1 shl 5);  // use a tri-pane window
  
{$EXTERNALSYM HHWIN_PROP_TRI_PANE}
  HHWIN_PROP_NOTB_TEXT       
= (1 shl 6);  // no text on toolbar buttons
  
{$EXTERNALSYM HHWIN_PROP_NOTB_TEXT}
  HHWIN_PROP_POST_QUIT       
= (1 shl 7);  // post WM_QUIT message when window closes
  
{$EXTERNALSYM HHWIN_PROP_POST_QUIT}
  HHWIN_PROP_AUTO_SYNC       
= (1 shl 8);  // automatically ssync contents and index
  
{$EXTERNALSYM HHWIN_PROP_AUTO_SYNC}
  HHWIN_PROP_TRACKING        
= (1 shl 9);  // send tracking notification messages
  
{$EXTERNALSYM HHWIN_PROP_TRACKING}
  HHWIN_PROP_TAB_SEARCH      
= (1 shl 10); // include search tab in navigation pane
  
{$EXTERNALSYM HHWIN_PROP_TAB_SEARCH}
  HHWIN_PROP_TAB_HISTORY     
= (1 shl 11); // include history tab in navigation pane
  
{$EXTERNALSYM HHWIN_PROP_TAB_HISTORY}
{$IFDEF HTMLHELP11}
  HHWIN_PROP_TAB_BOOKMARKS   
= (1 shl 12); // include bookmark tab in navigation pane
  
{$EXTERNALSYM HHWIN_PROP_TAB_BOOKMARKS}
{$ENDIF}
{$IFDEF HTMLHELP12}
  HHWIN_PROP_TAB_FAVORITES   
= (1 shl 12); // include favorites tab in navigation pane
  
{$EXTERNALSYM HHWIN_PROP_TAB_FAVORITES}
{$ENDIF}
  HHWIN_PROP_CHANGE_TITLE    
= (1 shl 13); // Put current HTML title in title bar
  
{$EXTERNALSYM HHWIN_PROP_CHANGE_TITLE}
  HHWIN_PROP_NAV_ONLY_WIN    
= (1 shl 14); // Only display the navigation window
  
{$EXTERNALSYM HHWIN_PROP_NAV_ONLY_WIN}
  HHWIN_PROP_NO_TOOLBAR      
= (1 shl 15); // Don't display a toolbar
  {$EXTERNALSYM HHWIN_PROP_NO_TOOLBAR}
  HHWIN_PROP_MENU            
= (1 shl 16); // Menu
  
{$EXTERNALSYM HHWIN_PROP_MENU}
  HHWIN_PROP_TAB_ADVSEARCH   
= (1 shl 17); // Advanced FTS UI.
  
{$EXTERNALSYM HHWIN_PROP_TAB_ADVSEARCH}
  HHWIN_PROP_USER_POS        
= (1 shl 18); // After initial creation, user controls window size/Position
  
{$EXTERNALSYM HHWIN_PROP_USER_POS}
{$IFDEF HTMLHELP12}
  HHWIN_PROP_TAB_CUSTOM1     
= (1 shl 19); // Use custom tab #1
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM1}
  HHWIN_PROP_TAB_CUSTOM2     
= (1 shl 20); // Use custom tab #2
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM2}
  HHWIN_PROP_TAB_CUSTOM3     
= (1 shl 21); // Use custom tab #3
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM3}
  HHWIN_PROP_TAB_CUSTOM4     
= (1 shl 22); // Use custom tab #4
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM4}
  HHWIN_PROP_TAB_CUSTOM5     
= (1 shl 23); // Use custom tab #5
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM5}
  HHWIN_PROP_TAB_CUSTOM6     
= (1 shl 24); // Use custom tab #6
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM6}
  HHWIN_PROP_TAB_CUSTOM7     
= (1 shl 25); // Use custom tab #7
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM7}
  HHWIN_PROP_TAB_CUSTOM8     
= (1 shl 26); // Use custom tab #8
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM8}
  HHWIN_PROP_TAB_CUSTOM9     
= (1 shl 27); // Use custom tab #9
  
{$EXTERNALSYM HHWIN_PROP_TAB_CUSTOM9}
  HHWIN_TB_MARGIN            
= (1 shl 28); // the window type has a margin
  
{$EXTERNALSYM HHWIN_TB_MARGIN}
{$ENDIF}

  HHWIN_PARAM_PROPERTIES     
= (1 shl 1);  // valid fsWinProperties
  
{$EXTERNALSYM HHWIN_PARAM_PROPERTIES}
  HHWIN_PARAM_STYLES         
= (1 shl 2);  // valid dwStyles
  
{$EXTERNALSYM HHWIN_PARAM_STYLES}
  HHWIN_PARAM_EXSTYLES       
= (1 shl 3);  // valid dwExStyles
  
{$EXTERNALSYM HHWIN_PARAM_EXSTYLES}
  HHWIN_PARAM_RECT           
= (1 shl 4);  // valid rcWindowPos
  
{$EXTERNALSYM HHWIN_PARAM_RECT}
  HHWIN_PARAM_NAV_WIDTH      
= (1 shl 5);  // valid iNavWidth
  
{$EXTERNALSYM HHWIN_PARAM_NAV_WIDTH}
  HHWIN_PARAM_SHOWSTATE      
= (1 shl 6);  // valid nShowState
  
{$EXTERNALSYM HHWIN_PARAM_SHOWSTATE}
  HHWIN_PARAM_INFOTYPES      
= (1 shl 7);  // valid apInfoTypes
  
{$EXTERNALSYM HHWIN_PARAM_INFOTYPES}
  HHWIN_PARAM_TB_FLAGS       
= (1 shl 8);  // valid fsToolBarFlags
  
{$EXTERNALSYM HHWIN_PARAM_TB_FLAGS}
  HHWIN_PARAM_EXPANSION      
= (1 shl 9);  // valid fNotExpanded
  
{$EXTERNALSYM HHWIN_PARAM_EXPANSION}
  HHWIN_PARAM_TABPOS         
= (1 shl 10); // valid tabpos
  
{$EXTERNALSYM HHWIN_PARAM_TABPOS}
  HHWIN_PARAM_TABORDER       
= (1 shl 11); // valid taborder
  
{$EXTERNALSYM HHWIN_PARAM_TABORDER}
  HHWIN_PARAM_HISTORY_COUNT  
= (1 shl 12); // valid cHistory
  
{$EXTERNALSYM HHWIN_PARAM_HISTORY_COUNT}
  HHWIN_PARAM_CUR_TAB        
= (1 shl 13); // valid curNavType
  
{$EXTERNALSYM HHWIN_PARAM_CUR_TAB}

  HHWIN_BUTTON_EXPAND        
= (1 shl 1);  // Expand/contract button
  
{$EXTERNALSYM HHWIN_BUTTON_EXPAND}
  HHWIN_BUTTON_BACK          
= (1 shl 2);  // Back button
  
{$EXTERNALSYM HHWIN_BUTTON_BACK}
  HHWIN_BUTTON_FORWARD       
= (1 shl 3);  // Forward button
  
{$EXTERNALSYM HHWIN_BUTTON_FORWARD}
  HHWIN_BUTTON_STOP          
= (1 shl 4);  // Stop button
  
{$EXTERNALSYM HHWIN_BUTTON_STOP}
  HHWIN_BUTTON_REFRESH       
= (1 shl 5);  // Refresh button
  
{$EXTERNALSYM HHWIN_BUTTON_REFRESH}
  HHWIN_BUTTON_HOME          
= (1 shl 6);  // Home button
  
{$EXTERNALSYM HHWIN_BUTTON_HOME}
  HHWIN_BUTTON_BROWSE_FWD    
= (1 shl 7);  // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_BROWSE_FWD}
  HHWIN_BUTTON_BROWSE_BCK    
= (1 shl 8);  // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_BROWSE_BCK}
  HHWIN_BUTTON_NOTES         
= (1 shl 9);  // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_NOTES}
  HHWIN_BUTTON_CONTENTS      
= (1 shl 10); // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_CONTENTS}
  HHWIN_BUTTON_SYNC          
= (1 shl 11); // Sync button
  
{$EXTERNALSYM HHWIN_BUTTON_SYNC}
  HHWIN_BUTTON_OPTIONS       
= (1 shl 12); // Options button
  
{$EXTERNALSYM HHWIN_BUTTON_OPTIONS}
  HHWIN_BUTTON_PRINT         
= (1 shl 13); // Print button
  
{$EXTERNALSYM HHWIN_BUTTON_PRINT}
  HHWIN_BUTTON_INDEX         
= (1 shl 14); // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_INDEX}
  HHWIN_BUTTON_SEARCH        
= (1 shl 15); // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_SEARCH}
  HHWIN_BUTTON_HISTORY       
= (1 shl 16); // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_HISTORY}
{$IFDEF HTMLHELP11}
  HHWIN_BUTTON_BOOKMARKS     
= (1 shl 17); // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_BOOKMARKS}
{$ENDIF}
{$IFDEF HTMLHELP12}
  HHWIN_BUTTON_FAVORITES     
= (1 shl 17); // not implemented
  
{$EXTERNALSYM HHWIN_BUTTON_FAVORITES}
{$ENDIF}
  HHWIN_BUTTON_JUMP1         
= (1 shl 18);
  
{$EXTERNALSYM HHWIN_BUTTON_JUMP1}
  HHWIN_BUTTON_JUMP2         
= (1 shl 19);
  
{$EXTERNALSYM HHWIN_BUTTON_JUMP2}
  HHWIN_BUTTON_ZOOM          
= (1 shl 20);
  
{$EXTERNALSYM HHWIN_BUTTON_ZOOM}
  HHWIN_BUTTON_TOC_NEXT      
= (1 shl 21);
  
{$EXTERNALSYM HHWIN_BUTTON_TOC_NEXT}
  HHWIN_BUTTON_TOC_PREV      
= (1 shl 22);
  
{$EXTERNALSYM HHWIN_BUTTON_TOC_PREV}

  HHWIN_DEF_BUTTONS 
= HHWIN_BUTTON_EXPAND or HHWIN_BUTTON_BACK or
                      HHWIN_BUTTON_OPTIONS 
or HHWIN_BUTTON_PRINT;
  
{$EXTERNALSYM HHWIN_DEF_BUTTONS}

// Button IDs

  IDTB_EXPAND       
= 200;
  
{$EXTERNALSYM IDTB_EXPAND}
  IDTB_CONTRACT     
= 201;
  
{$EXTERNALSYM IDTB_CONTRACT}
  IDTB_STOP         
= 202;
  
{$EXTERNALSYM IDTB_STOP}
  IDTB_REFRESH      
= 203;
  
{$EXTERNALSYM IDTB_REFRESH}
  IDTB_BACK         
= 204;
  
{$EXTERNALSYM IDTB_BACK}
  IDTB_HOME         
= 205;
  
{$EXTERNALSYM IDTB_HOME}
  IDTB_SYNC         
= 206;
  
{$EXTERNALSYM IDTB_SYNC}
  IDTB_PRINT        
= 207;
  
{$EXTERNALSYM IDTB_PRINT}
  IDTB_OPTIONS      
= 208;
  
{$EXTERNALSYM IDTB_OPTIONS}
  IDTB_FORWARD      
= 209;
  
{$EXTERNALSYM IDTB_FORWARD}
  IDTB_NOTES        
= 210;                 // not implemented
  
{$EXTERNALSYM IDTB_NOTES}
  IDTB_BROWSE_FWD   
= 211;
  
{$EXTERNALSYM IDTB_BROWSE_FWD}
  IDTB_BROWSE_BACK  
= 212;
  
{$EXTERNALSYM IDTB_BROWSE_BACK}
  IDTB_CONTENTS     
= 213;                 // not implemented
  
{$EXTERNALSYM IDTB_CONTENTS}
  IDTB_INDEX        
= 214;                 // not implemented
  
{$EXTERNALSYM IDTB_INDEX}
  IDTB_SEARCH       
= 215;                 // not implemented
  
{$EXTERNALSYM IDTB_SEARCH}
  IDTB_HISTORY      
= 216;                 // not implemented
  
{$EXTERNALSYM IDTB_HISTORY}
{$IFDEF HTMLHELP11}
  IDTB_BOOKMARKS    
= 217;                 // not implemented
  
{$EXTERNALSYM IDTB_BOOKMARKS}
{$ENDIF}
{$IFDEF HTMLHELP12}
  IDTB_FAVORITES    
= 217;                 // not implemented
  
{$EXTERNALSYM IDTB_FAVORITES}
{$ENDIF}
  IDTB_JUMP1        
= 218;
  
{$EXTERNALSYM IDTB_JUMP1}
  IDTB_JUMP2        
= 219;
  
{$EXTERNALSYM IDTB_JUMP2}
  IDTB_CUSTOMIZE    
= 221;
  
{$EXTERNALSYM IDTB_CUSTOMIZE}
  IDTB_ZOOM         
= 222;
  
{$EXTERNALSYM IDTB_ZOOM}
  IDTB_TOC_NEXT     
= 223;
  
{$EXTERNALSYM IDTB_TOC_NEXT}
  IDTB_TOC_PREV     
= 224;
  
{$EXTERNALSYM IDTB_TOC_PREV}

// Notification codes

  HHN_FIRST         
= -860;
  
{$EXTERNALSYM HHN_FIRST}
  HHN_LAST          
= -879;
  
{$EXTERNALSYM HHN_LAST}

  HHN_NAVCOMPLETE   
= (HHN_FIRST - 0);
  
{$EXTERNALSYM HHN_NAVCOMPLETE}
  HHN_TRACK         
= (HHN_FIRST - 1);
  
{$EXTERNALSYM HHN_TRACK}
  HHN_WINDOW_CREATE 
= (HHN_FIRST - 2);
  
{$EXTERNALSYM HHN_WINDOW_CREATE}

type
  PHHLastError 
= ^THHLastError;
  tagHH_LAST_ERROR 
= packed record
    cbStruct: Integer;      
// size of this structure
    hr: HRESULT;            
// the last error code.
    description: PWideChar; 
// a description of the error (unicode string - BSTR).
  
end;
  THHLastError 
= tagHH_LAST_ERROR;

  PHHNNotify 
= ^THHNNotify;
  tagHHN_NOTIFY 
= packed record
    hdr: NMHDR;
    pszUrl: PCSTR;                         
// multibyte null-terminated string
  
end;
  
{$EXTERNALSYM tagHHN_NOTIFY}
  HHN_NOTIFY 
= tagHHN_NOTIFY;
  
{$EXTERNALSYM HHN_NOTIFY}
  THHNNotify 
= tagHHN_NOTIFY;

  PHHPopup 
= ^THHPopup;
  tagHH_POPUP 
= packed record
    cbStruct: Integer;                     
// sizeof this structure
    hinst: HINST;                          
// instance handle for string resource
    idString: UINT;                        
// string resource id, or text id if pszFile is specified in HtmlHelp call
    pszText: LPCTSTR;                      
// used if idString is zero
    pt: TPoint;                            
// top center of popup window
    clrForeGround: TColorRef;              
// use -1 for default
    clrBackground: TColorRef;               
// use -1 for default
    rcMargins: TRect;                      
// amount of space between edges of window and text, -1 for each member to ignore
    pszFont: LPCTSTR;                      
// facename, point size, char set, BOLD ITALIC UNDERLINE
  
end;
  
{$EXTERNALSYM tagHH_POPUP}
  HH_POPUP 
= tagHH_POPUP;
  
{$EXTERNALSYM HH_POPUP}
  THHPopup 
= tagHH_POPUP;

  PHHAKLink 
= ^THHAKLink;
  tagHH_AKLINK 
= packed record
    cbStruct: Integer;                     
// sizeof this structure
    fReserved: BOOL;                       
// must be FALSE (really!)
    pszKeywords: LPCTSTR;                  
// semi-colon separated keywords
    pszUrl: LPCTSTR;                       
// URL to jump to if no keywords found (may be NULL)
    pszMsgText: LPCTSTR;                   
// Message text to display in MessageBox if pszUrl is NULL and no keyword match
    pszMsgTitle: LPCTSTR;                  
// Message text to display in MessageBox if pszUrl is NULL and no keyword match
    pszWindow: LPCTSTR;                    
// Window to display URL in
    fIndexOnFail: BOOL;                    
// Displays index if keyword lookup fails.
  
end;
  
{$EXTERNALSYM tagHH_AKLINK}
  HH_AKLINK 
= tagHH_AKLINK;
  
{$EXTERNALSYM HH_AKLINK}
  THHAKLink 
= tagHH_AKLINK;

const
  HHWIN_NAVTYPE_TOC          
= 0;
  
{$EXTERNALSYM HHWIN_NAVTYPE_TOC}
  HHWIN_NAVTYPE_INDEX        
= 1;
  
{$EXTERNALSYM HHWIN_NAVTYPE_INDEX}
  HHWIN_NAVTYPE_SEARCH       
= 2;
  
{$EXTERNALSYM HHWIN_NAVTYPE_SEARCH}
{$IFDEF HTMLHELP11}
  HHWIN_NAVTYPE_BOOKMARKS    
= 3;
  
{$EXTERNALSYM HHWIN_NAVTYPE_BOOKMARKS}
  HHWIN_NAVTYPE_HISTORY      
= 4;          //not implemented
  
{$EXTERNALSYM HHWIN_NAVTYPE_HISTORY}
{$ENDIF}
{$IFDEF HTMLHELP12}
  HHWIN_NAVTYPE_FAVORITES    
= 3;
  
{$EXTERNALSYM HHWIN_NAVTYPE_FAVORITES}
  HHWIN_NAVTYPE_HISTORY      
= 4;          //not implemented
  
{$EXTERNALSYM HHWIN_NAVTYPE_HISTORY}
  HHWIN_NAVTYPE_AUTHOR       
= 5;
  
{$EXTERNALSYM HHWIN_NAVTYPE_AUTHOR}
  HHWIN_NAVTYPE_CUSTOM_FIRST 
= 11;
  
{$EXTERNALSYM HHWIN_NAVTYPE_CUSTOM_FIRST}
{$ENDIF}

  IT_INCLUSIVE 
= 0;
  
{$EXTERNALSYM IT_INCLUSIVE}
  IT_EXCLUSIVE 
= 1;
  
{$EXTERNALSYM IT_EXCLUSIVE}
  IT_HIDDEN    
= 2;
  
{$EXTERNALSYM IT_HIDDEN}

type
  PHHEnumIT 
= ^THHEnumIT;
  tagHH_ENUM_IT 
= packed record
    cbStruct: Integer;        
// size of this structure
    iType: Integer;           
// the type of the information type ie. Inclusive, Exclusive, or Hidden
    pszCatName: LPCSTR;       
// Set to the name of the Category to enumerate the info types in a category; else NULL
    pszITName: LPCSTR;        
// volitile pointer to the name of the infotype. Allocated by call. Caller responsible for freeing
    pszITDescription: LPCSTR; 
// volitile pointer to the description of the infotype.
  
end;
  
{$EXTERNALSYM tagHH_ENUM_IT}
  HH_ENUM_IT 
= tagHH_ENUM_IT;
  
{$EXTERNALSYM HH_ENUM_IT}
  PHH_ENUM_IT 
= ^tagHH_ENUM_IT;
  
{$EXTERNALSYM PHH_ENUM_IT}
  THHEnumIT 
= tagHH_ENUM_IT;

  PHHEnumCat 
= ^THHEnumCat;
  tagHH_ENUM_CAT 
= packed record
    cbStruct: Integer;         
// size of this structure
    pszCatName: LPCSTR;        
// volitile pointer to the category name
    pszCatDescription: LPCSTR; 
// volitile pointer to the category description
  
end;
  
{$EXTERNALSYM tagHH_ENUM_CAT}
  HH_ENUM_CAT 
= tagHH_ENUM_CAT;
  
{$EXTERNALSYM HH_ENUM_CAT}
  PHH_ENUM_CAT 
= ^tagHH_ENUM_CAT;
  
{$EXTERNALSYM PHH_ENUM_CAT}
  THHEnumCat 
= tagHH_ENUM_CAT;

  PHHSetInfoType 
= ^THHSetInfoType;
  tagHH_SET_INFOTYPE 
= packed record
    cbStruct: Integer;        
// the size of this structure
    pszCatName: LPCSTR;       
// the name of the category, if any, the InfoType is a member of.
    pszInfoTypeName: LPCSTR;  
// the name of the info type to add to the filter
  
end;
  
{$EXTERNALSYM tagHH_SET_INFOTYPE}
  HH_SET_INFOTYPE 
= tagHH_SET_INFOTYPE;
  
{$EXTERNALSYM HH_SET_INFOTYPE}
  PHH_SET_INFOTYPE 
= ^tagHH_SET_INFOTYPE;
  
{$EXTERNALSYM PHH_SET_INFOTYPE}
  THHSetInfoType 
= tagHH_SET_INFOTYPE;

  HH_INFOTYPE 
= DWORD;
  
{$EXTERNALSYM HH_INFOTYPE}
  PHH_INFOTYPE 
= ^HH_INFOTYPE;
  
{$EXTERNALSYM PHH_INFOTYPE}
  PHHInfoType 
= ^THHInfoType;
  THHInfoType 
= HH_INFOTYPE;

const
  HHWIN_NAVTAB_TOP    
= 0;
  
{$EXTERNALSYM HHWIN_NAVTAB_TOP}
  HHWIN_NAVTAB_LEFT   
= 1;
  
{$EXTERNALSYM HHWIN_NAVTAB_LEFT}
  HHWIN_NAVTAB_BOTTOM 
= 2;
  
{$EXTERNALSYM HHWIN_NAVTAB_BOTTOM}

  HH_MAX_TABS         
= 19;
  
{$EXTERNALSYM HH_MAX_TABS}

  HH_TAB_CONTENTS     
= 0;
  
{$EXTERNALSYM HH_TAB_CONTENTS}
  HH_TAB_INDEX        
= 1;
  
{$EXTERNALSYM HH_TAB_INDEX}
  HH_TAB_SEARCH       
= 2;
  
{$EXTERNALSYM HH_TAB_SEARCH}
{$IFDEF HTMLHELP11}
  HH_TAB_BOOKMARKS    
= 3;
  
{$EXTERNALSYM HH_TAB_BOOKMARKS}
  HH_TAB_HISTORY      
= 4;
  
{$EXTERNALSYM HH_TAB_HISTORY}
{$ENDIF}
{$IFDEF HTMLHELP12}
  HH_TAB_FAVORITES    
= 3;
  
{$EXTERNALSYM HH_TAB_FAVORITES}
  HH_TAB_HISTORY      
= 4;
  
{$EXTERNALSYM HH_TAB_HISTORY}
  HH_TAB_AUTHOR       
= 5;
  
{$EXTERNALSYM HH_TAB_AUTHOR}

  HH_TAB_CUSTOM_FIRST 
= 11;
  
{$EXTERNALSYM HH_TAB_CUSTOM_FIRST}
  HH_TAB_CUSTOM_LAST  
= HH_MAX_TABS;
  
{$EXTERNALSYM HH_TAB_CUSTOM_LAST}

  HH_MAX_TABS_CUSTOM  
= HH_TAB_CUSTOM_LAST - HH_TAB_CUSTOM_FIRST + 1;
  
{$EXTERNALSYM HH_MAX_TABS_CUSTOM}
{$ENDIF}

// HH_DISPLAY_SEARCH Command Related Structures and Constants

  HH_FTS_DEFAULT_PROXIMITY 
= -1;
  
{$EXTERNALSYM HH_FTS_DEFAULT_PROXIMITY}

type
  PHHFtsQuery 
= ^THHFtsQuery;
  tagHH_FTS_QUERY 
= packed record
    cbStruct: Integer;         
// Sizeof structure in bytes.
    fUniCodeStrings: BOOL;     
// TRUE if all strings are unicode.
    pszSearchQuery: LPCTSTR;   
// String containing the search query.
    iProximity: LongInt;       
// Word proximity.
    fStemmedSearch: BOOL;      
// TRUE for StemmedSearch only.
    fTitleOnly: BOOL;          
// TRUE for Title search only.
    fExecute: BOOL;            
// TRUE to initiate the search.
    pszWindow: LPCTSTR;        
// Window to display in
  
end;
  
{$EXTERNALSYM tagHH_FTS_QUERY}
  HH_FTS_QUERY 
= tagHH_FTS_QUERY;
  
{$EXTERNALSYM HH_FTS_QUERY}
  THHFtsQuery 
= tagHH_FTS_QUERY;

  PHHWinType 
= ^THHWinType;
  tagHH_WINTYPE 
= packed record
    cbStruct: Integer;      
// IN: size of this structure including all Information Types
    fUniCodeStrings: BOOL;  
// IN/OUT: TRUE if all strings are in UNICODE
    pszType: LPCTSTR;       
// IN/OUT: Name of a type of window
    fsValidMembers: DWORD;  
// IN: Bit flag of valid members (HHWIN_PARAM_)
    fsWinProperties: DWORD; 
// IN/OUT: Properties/attributes of the window (HHWIN_)

    pszCaption: LPCTSTR;    
// IN/OUT: Window title
    dwStyles: DWORD;        
// IN/OUT: Window styles
    dwExStyles: DWORD;      
// IN/OUT: Extended Window styles
    rcWindowPos: TRect;     
// IN: Starting position, OUT: current position
    nShowState: Integer;    
// IN: show state (e.g., SW_SHOW)

    hwndHelp: HWND;         
// OUT: window handle
    hwndCaller: HWND;       
// OUT: who called this window

    paInfoTypes: PHHInfoType; 
// IN: Pointer to an array of Information Types

    
{ The following members are only valid if HHWIN_PROP_TRI_PANE is set }

    hwndToolBar: HWND;      
// OUT: toolbar window in tri-pane window
    hwndNavigation: HWND;   
// OUT: navigation window in tri-pane window
    hwndHTML: HWND;         
// OUT: window displaying HTML in tri-pane window
    iNavWidth: Integer;     
// IN/OUT: width of navigation window
    rcHTML: TRect;          
// OUT: HTML window coordinates

    pszToc: LPCTSTR;        
// IN: Location of the table of contents file
    pszIndex: LPCTSTR;      
// IN: Location of the index file
    pszFile: LPCTSTR;       
// IN: Default location of the html file
    pszHome: LPCTSTR;       
// IN/OUT: html file to display when Home button is clicked
    fsToolBarFlags: DWORD;  
// IN: flags controling the appearance of the toolbar
    fNotExpanded: BOOL;     
// IN: TRUE/FALSE to contract or expand, OUT: current state
    curNavType: Integer;    
// IN/OUT: UI to display in the navigational pane
    tabpos: Integer;        
// IN/OUT: HHWIN_NAVTAB_TOP, HHWIN_NAVTAB_LEFT, or HHWIN_NAVTAB_BOTTOM
    idNotify: Integer;      
// IN: ID to use for WM_NOTIFY messages
    tabOrder: 
array[0..HH_MAX_TABS] of Byte; // IN/OUT: tab order: Contents, Index, Search, History, Favorites, Reserved 1-5, Custom tabs
    cHistory: Integer;      
// IN/OUT: number of history items to keep (default is 30)
    pszJump1: LPCTSTR;      
// Text for HHWIN_BUTTON_JUMP1
    pszJump2: LPCTSTR;      
// Text for HHWIN_BUTTON_JUMP2
    pszUrlJump1: LPCTSTR;   
// URL for HHWIN_BUTTON_JUMP1
    pszUrlJump2: LPCTSTR;   
// URL for HHWIN_BUTTON_JUMP2
    rcMinSize: TRect;       
// Minimum size for window (ignored in version 1)
    cbInfoTypes: Integer;   
// size of paInfoTypes;
{$IFDEF HTMLHELP12}
    pszCustomTabs: LPCTSTR; 
// multiple zero-terminated Strings
{$ENDIF}
  
end;
  
{$EXTERNALSYM tagHH_WINTYPE}
  HH_WINTYPE 
= tagHH_WINTYPE;
  
{$EXTERNALSYM HH_WINTYPE}
  PHH_WINTYPE 
= ^tagHH_WINTYPE;
  
{$EXTERNALSYM PHH_WINTYPE}
  THHWinType 
= tagHH_WINTYPE;

const
  HHACT_TAB_CONTENTS  
= 0;
  
{$EXTERNALSYM HHACT_TAB_CONTENTS}
  HHACT_TAB_INDEX     
= 1;
  
{$EXTERNALSYM HHACT_TAB_INDEX}
  HHACT_TAB_SEARCH    
= 2;
  
{$EXTERNALSYM HHACT_TAB_SEARCH}
  HHACT_TAB_HISTORY   
= 3;
  
{$EXTERNALSYM HHACT_TAB_HISTORY}
  HHACT_TAB_FAVORITES 
= 4;
  
{$EXTERNALSYM HHACT_TAB_FAVORITES}
  HHACT_EXPAND        
= 5;
  
{$EXTERNALSYM HHACT_EXPAND}
  HHACT_CONTRACT      
= 6;
  
{$EXTERNALSYM HHACT_CONTRACT}
  HHACT_BACK          
= 7;
  
{$EXTERNALSYM HHACT_BACK}
  HHACT_FORWARD       
= 8;
  
{$EXTERNALSYM HHACT_FORWARD}
  HHACT_STOP          
= 9;
  
{$EXTERNALSYM HHACT_STOP}
  HHACT_REFRESH       
= 10;
  
{$EXTERNALSYM HHACT_REFRESH}
  HHACT_HOME          
= 11;
  
{$EXTERNALSYM HHACT_HOME}
  HHACT_SYNC          
= 12;
  
{$EXTERNALSYM HHACT_SYNC}
  HHACT_OPTIONS       
= 13;
  
{$EXTERNALSYM HHACT_OPTIONS}
  HHACT_PRINT         
= 14;
  
{$EXTERNALSYM HHACT_PRINT}
  HHACT_HIGHLIGHT     
= 15;
  
{$EXTERNALSYM HHACT_HIGHLIGHT}
  HHACT_CUSTOMIZE     
= 16;
  
{$EXTERNALSYM HHACT_CUSTOMIZE}
  HHACT_JUMP1         
= 17;
  
{$EXTERNALSYM HHACT_JUMP1}
  HHACT_JUMP2         
= 18;
  
{$EXTERNALSYM HHACT_JUMP2}
  HHACT_ZOOM          
= 19;
  
{$EXTERNALSYM HHACT_ZOOM}
  HHACT_TOC_NEXT      
= 20;
  
{$EXTERNALSYM HHACT_TOC_NEXT}
  HHACT_TOC_PREV      
= 21;
  
{$EXTERNALSYM HHACT_TOC_PREV}
  HHACT_NOTES         
= 22;
  
{$EXTERNALSYM HHACT_NOTES}
  HHACT_LAST_ENUM     
= 23;
  
{$EXTERNALSYM HHACT_LAST_ENUM}

type
  PHHNTrack 
= ^THHNTrack;
  tagHHNTRACK 
= packed record
    hdr: NMHDR;
    pszCurUrl: PCSTR;        
// Multi-byte, null-terminated string
    idAction: Integer;       
// HHACT_ value
    phhWinType: PHHWinType;  
// Current window type structure
  
end;
  
{$EXTERNALSYM tagHHNTRACK}
  HHNTRACK 
= tagHHNTRACK;
  
{$EXTERNALSYM HHNTRACK}
  THHNTrack 
= tagHHNTRACK;

{$IFDEF HTMLHELP_DYNAMIC_LINK}
type
  THtmlHelpA 
= function (hwndCaller: HWND; pszFile: PAnsiChar; uCommand: UINT;
    
{$IFDEF HTMLHELP11}dwData: DWORD): HWND; stdcall;{$ENDIF}
    
{$IFDEF HTMLHELP12}dwData: DWORD_PTR): HWND; stdcall;{$ENDIF}
  THtmlHelpW 
= function (hwndCaller: HWND; pszFile: PWideChar; uCommand: UINT;
    
{$IFDEF HTMLHELP11}dwData: DWORD): HWND; stdcall;{$ENDIF}
    
{$IFDEF HTMLHELP12}dwData: DWORD_PTR): HWND; stdcall;{$ENDIF}
  THtmlHelp 
= THtmlHelpA;

var
  HtmlHelpA: THtmlHelpA 
= nil;
  HtmlHelpW: THtmlHelpW 
= nil;
  HtmlHelp: THtmlHelp 
= nil;
{$ELSE}
function HtmlHelpA(hwndCaller: HWND; pszFile: PAnsiChar; uCommand: UINT;
{$IFDEF HTMLHELP11}
  dwData: DWORD): HWND; stdcall;
{$ENDIF}
{$IFDEF HTMLHELP12}
  dwData: DWORD_PTR): HWND; stdcall;
{$ENDIF}
{$EXTERNALSYM HtmlHelpA}
function HtmlHelpW(hwndCaller: HWND; pszFile: PWideChar; uCommand: UINT;
{$IFDEF HTMLHELP11}
  dwData: DWORD): HWND; stdcall;
{$ENDIF}
{$IFDEF HTMLHELP12}
  dwData: DWORD_PTR): HWND; stdcall;
{$ENDIF}
{$EXTERNALSYM HtmlHelpW}
function HtmlHelp(hwndCaller: HWND; pszFile: PChar; uCommand: UINT;
{$IFDEF HTMLHELP11}
  dwData: DWORD): HWND; stdcall;
{$ENDIF}
{$IFDEF HTMLHELP12}
  dwData: DWORD_PTR): HWND; stdcall;
{$ENDIF}
{$EXTERNALSYM HtmlHelp}
{$ENDIF}

// Use the following for GetProcAddress to load from hhctrl.ocx

const
  ATOM_HTMLHELP_API_ANSI    
= LPTSTR(DWORD(WORD(14)));
  
{$EXTERNALSYM ATOM_HTMLHELP_API_ANSI}
  ATOM_HTMLHELP_API_UNICODE 
= LPTSTR(DWORD(WORD(15)));
  
{$EXTERNALSYM ATOM_HTMLHELP_API_UNICODE}

{$IFDEF HTMLHELP12}
// Global Control Properties

const
  HH_GPROPID_SINGLETHREAD     
= 1// VARIANT_BOOL: True for single thread
  
{$EXTERNALSYM HH_GPROPID_SINGLETHREAD}
  HH_GPROPID_TOOLBAR_MARGIN   
= 2// long: Provides a left/right margin around the toolbar.
  
{$EXTERNALSYM HH_GPROPID_TOOLBAR_MARGIN}
  HH_GPROPID_UI_LANGUAGE      
= 3// long: LangId of the UI.
  
{$EXTERNALSYM HH_GPROPID_UI_LANGUAGE}
  HH_GPROPID_CURRENT_SUBSET   
= 4// BSTR: Current subset.
  
{$EXTERNALSYM HH_GPROPID_CURRENT_SUBSET}
  HH_GPROPID_CONTENT_LANGUAGE 
= 5// long: LandId for desired content.
  
{$EXTERNALSYM HH_GPROPID_CONTENT_LANGUAGE}

type
  HH_GPROPID 
= HH_GPROPID_SINGLETHREAD..HH_GPROPID_CONTENT_LANGUAGE;
  
{$EXTERNALSYM HH_GPROPID}
  THHGPropID 
= HH_GPROPID;

// Global Property structure

  PHHGlobalProperty 
= ^THHGlobalProperty;
  tagHH_GLOBAL_PROPERTY 
= record
    id: THHGPropID;
    Dummy: Integer;                        
// JEDI: Added to enforce 8-byte packing
    
var_: OleVariant;
  
end;
  HH_GLOBAL_PROPERTY 
= tagHH_GLOBAL_PROPERTY;
  THHGlobalProperty 
= tagHH_GLOBAL_PROPERTY;
{$ENDIF}

{$IFDEF HTMLHELP_DYNAMIC_LINK}
function HtmlHelpLoaded: Boolean;
{$IFDEF HTMLHELP_DYNAMIC_LINK_EXPLICIT}
function LoadHtmlHelp: Boolean;
function UnLoadHtmlHelp: Boolean;
{$ENDIF}
{$ENDIF}

type
  THtmlHelp 
= class(TComponent)
  private
    FOldHelpEvent: THelpEvent;
    FFileName: String;
    FWinDef: String;

    
function GetFileName: String;
    
function HelpFunc(Command : Word; Data : Longint; Var CallHelp : Boolean) : Boolean;
    
function GetHHString(Topic: String): String;
  protected
    
function DoHtmlHelp(uCommand: UINT; dwData: DWORD): HWND;
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy; override;

    
function HelpContext(ContextId: DWord): Integer;
    
function HelpTopic(Topic: String): Integer;
    
function ShowIndex:integer;
    
function ShowTableofContents:integer;
    
function ShowSearch:integer;
  published
    property FileName: String read GetFileName write FFileName;
    property WinDef: String read FWindef write fWindef;
  
end;

//取帮助文件名
function HelpFileName: String;
//根据 ContextId 调用帮助
function ShowHelpContext(ContextId: DWord): Integer;
//根据检索字符调用帮助
function ShowHelpTopic(Topic: String): Integer;
//显示主帮助窗口
function ShowHelpWindow: Integer;
//显示主帮助窗口的索引栏
function ShowHelpIndex: Integer;
//显示主帮助窗口的搜索栏
function ShowHelpSearch: Integer;
//设置主帮助文件名
procedure SetHelpFileName(FileName: String);

var
  Helper: THtmlHelp;

implementation

procedure CheckHelper;
begin
  
if not Assigned(Helper) then
    Helper :
= THtmlHelp.Create(Application);
end;

procedure SetHelpFileName(FileName: String);
begin
  CheckHelper;
  Helper.FileName :
= FileName;
end;

function HelpFileName: String;
begin
  CheckHelper;
  Result :
= Helper.FileName;
end;

function ShowHelpTopic(Topic: String): Integer;
begin
  CheckHelper;
  Result :
= Helper.HelpTopic(Topic);
end;

function ShowHelpContext(ContextId: DWord): Integer;
begin
  CheckHelper;
  Result :
= Helper.HelpContext(ContextID);
end;

function ShowHelpWindow: Integer;
begin
  CheckHelper;
  Result :
= Helper.ShowTableofContents;
end;

function ShowHelpSearch: Integer;
begin
  CheckHelper;
  Result :
= Helper.ShowSearch;
end;

function ShowHelpIndex: Integer;
begin
  CheckHelper;
  Result :
= Helper.ShowIndex;
end;


{$IFDEF HTMLHELP_DYNAMIC_LINK}
uses
  Registry, SysUtils;

var
  HtmlHelpLib: THandle 
= 0;

function GetOCXPath(var Path: string): Boolean;
const
  HHPathRegKey 
= 'CLSID\{adb880a6-d8ff-11cf-9377-00aa003b7a11}\InprocServer32';
begin
  
with TRegistry.Create do
  try
    RootKey :
= HKEY_CLASSES_ROOT;
    
if OpenKeyReadOnly(HHPathRegKey) then Path := ReadString('');
    Result :
= (Path <> ''and FileExists(Path);
  finally
    Free;
  
end;
end;

function HtmlHelpLoaded: Boolean;
begin
  Result :
= HtmlHelpLib <> 0;
end;

function UnLoadHtmlHelp: Boolean;
begin
  Result :
= True;
  
if HtmlHelpLoaded then
  
begin
    
if Assigned(HtmlHelp) then HtmlHelp(0nil, HH_CLOSE_ALL, 0);
    Result :
= FreeLibrary(HtmlHelpLib);
    HtmlHelpLib :
= 0;
    @HtmlHelpA :
= nil;
    @HtmlHelpW :
= nil;
    @HtmlHelp :
= nil;
  
end;
end;

function LoadHtmlHelp: Boolean;
const
  ProcNameA 
= 'HtmlHelpA';
  ProcNameW 
= 'HtmlHelpW';
  ProcName 
= ProcNameA;
var
  HHOCXPath: string;
begin
  Result :
= HtmlHelpLoaded;
  
if (not Result) and GetOCXPath(HHOCXPath) then
  
begin
    HtmlHelpLib :
= LoadLibrary(PChar(HHOCXPath));
    
if HtmlHelpLoaded then
    
begin
      @HtmlHelpA :
= GetProcAddress(HtmlHelpLib, ProcNameA);
      @HtmlHelpW :
= GetProcAddress(HtmlHelpLib, ProcNameW);
      @HtmlHelp  :
= GetProcAddress(HtmlHelpLib, ProcName);
      Result :
= Assigned(HtmlHelpA) and Assigned(HtmlHelpW);
      
if not Result then UnLoadHtmlHelp;
    
end;
  
end;
end;
{$ELSE}
const
  hhctrl 
= 'hhctrl.ocx';

function HtmlHelpA; external hhctrl Name 'HtmlHelpA';
{$EXTERNALSYM HtmlHelpA}
function HtmlHelpW; external hhctrl Name 'HtmlHelpW';
{$EXTERNALSYM HtmlHelpW}
function HtmlHelp; external hhctrl Name 'HtmlHelpA';
{$EXTERNALSYM HtmlHelp}
{$ENDIF}

{ THTMLHelp }

constructor THTMLHelp.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FFileName :
= '';
  FWinDef :
= '';

  FOldHelpEvent :
= Application.OnHelp;
  
if not (csdesigning in ComponentState) then Application.OnHelp := HelpFunc;
end;

destructor THTMLHelp.Destroy;
begin
  Application.OnHelp :
= FOldHelpEvent;
  inherited destroy;
end;

function THtmlHelp.getHHString(Topic: String): String;
begin
  Result :
= FileName;
  
if Length(Topic)>0 then
    Result :
= Result + '::' + Topic;
  
if Length(WinDef)>0 then
    Result :
= Result + '>' + WinDef;
end;

function THTMLHelp.HelpFunc(Command : Word; Data : Longint; Var CallHelp : Boolean) : Boolean;
begin
  CallHelp :
= False;
  
if (Command in [Help_Context, Help_ContextPopup]) then
  
begin
    CallHelp :
= false;
    HelpContext( Data );
  
end
  
else if Command=HELP_Finder then
     DoHtmlHelp(HH_DISPLAY_TOC, 
0);
  Result :
= true;
end;

function THTMLHelp.DoHtmlHelp(uCommand: UINT; dwData: DWORD): HWND;
begin
  
if (FileName=''or not FileExists(FileName) then Exit;
  Result :
= HtmlHelp(Application.Handle, PChar(GetHHString('')), uCommand, dwData);
end;

function THTMLHelp.GetFileName: String;
begin
  
if not (csdesigning in componentstate) then
  
begin
    
if FFileName='' then FFileName := Application.Helpfile;

    
if ExtractFilePath(FFileName)='' then
      FFileName:
= ExtractFilePath(Application.Exename) + FFileName;

    
if not FileExists(FFileName) then
      FFileName :
= ExtractFilePath(Application.Exename) + 'help.chm';
  
end;
  Result :
= FFileName;
end;

function THTMLHelp.HelpContext(ContextId: DWord): Integer;
begin
  Result :
= DoHtmlHelp(HH_HELP_CONTEXT, ContextID);
end;

function THTMLHelp.HelpTopic(Topic: String): Integer;
begin
  Result :
= DoHtmlHelp(HH_DISPLAY_TOPIC, 0);
end;

function THTMLHelp.ShowIndex: Integer;
begin
  Result :
= DoHtmlHelp(HH_DISPLAY_INDEX, 0);
end;

function THTMLHelp.ShowTableofContents: Integer;
begin
  Result :
= DoHtmlHelp(HH_DISPLAY_TOC, 0);
end;

function THTMLHelp.ShowSearch: integer;
var
  q:THHFTSQUERY;
begin
  q.cbStruct:
=sizeof(q);
  q.fUniCodeStrings:
=false;
  q.pszSearchQuery:
=nil;
  q.iProximity:
=HH_FTS_DEFAULT_PROXIMITY;
  q.fStemmedSearch   :
= FALSE ;
  q.fTitleOnly       :
= FALSE ;
  q.fExecute         :
= True ;
  q.pszWindow        :
= nil ;


  Result :
= DoHtmlHelp(HH_DISPLAY_SEARCH, DWord(@q));
end;

{$IFDEF HTMLHELP_DYNAMIC_LINK}
initialization
{$IFNDEF HTMLHELP_DYNAMIC_LINK_EXPLICIT}
  LoadHtmlHelp;
{$ENDIF}
finalization
  UnLoadHtmlHelp;
  
if Assigned(Helper) then Helper.Free;
{$ENDIF}

end.


posted @ 2008-06-08 22:37  陆岛工作室  阅读(1514)  评论(1编辑  收藏  举报