86 lines
2.6 KiB
C++
86 lines
2.6 KiB
C++
// Copyright (C) Microsoft Corporation 1996-1997, All Rights reserved.
|
|
|
|
#include "windows.h"
|
|
#include "htmlhelp.h"
|
|
|
|
#pragma data_seg(".text", "CODE")
|
|
static const char txtHHCtrl[] = "hhctrl.ocx";
|
|
static const char txtInProc[] = "CLSID\\{ADB880A6-D8FF-11CF-9377-00AA003B7A11}\\InprocServer32";
|
|
#pragma data_seg()
|
|
|
|
HWND (WINAPI *pHtmlHelpA)(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData);
|
|
HWND (WINAPI *pHtmlHelpW)(HWND hwndCaller, PCWSTR pszFile, UINT uCommand, DWORD_PTR dwData);
|
|
|
|
static BOOL GetRegisteredLocation(LPTSTR pszPathname)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
HKEY hKey;
|
|
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, txtInProc, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
|
|
DWORD dwSize = MAX_PATH;
|
|
if (RegQueryValueEx(hKey, "", 0, 0, (PBYTE) pszPathname, &dwSize) == ERROR_SUCCESS) {
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
extern "C"
|
|
HWND WINAPI HtmlHelpA(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData)
|
|
{
|
|
static HMODULE g_hmodHHCtrl;
|
|
static BOOL g_fTriedAndFailed;
|
|
|
|
if (!g_hmodHHCtrl && !g_fTriedAndFailed) {
|
|
char szHHCtrl[MAX_PATH];
|
|
if (GetRegisteredLocation(szHHCtrl))
|
|
g_hmodHHCtrl = LoadLibrary(szHHCtrl); // try registered location
|
|
if (!g_hmodHHCtrl)
|
|
g_hmodHHCtrl = LoadLibrary(txtHHCtrl); // try normal location
|
|
if (g_hmodHHCtrl == NULL) {
|
|
g_fTriedAndFailed = TRUE;
|
|
return NULL;
|
|
}
|
|
}
|
|
if (!pHtmlHelpA) {
|
|
(FARPROC&) pHtmlHelpA = GetProcAddress(g_hmodHHCtrl, ATOM_HTMLHELP_API_ANSI);
|
|
if (pHtmlHelpA == NULL) {
|
|
g_fTriedAndFailed = TRUE;
|
|
return NULL;
|
|
}
|
|
}
|
|
return pHtmlHelpA(hwndCaller, pszFile, uCommand, dwData);
|
|
}
|
|
|
|
extern "C"
|
|
HWND WINAPI HtmlHelpW(HWND hwndCaller, PCWSTR pszFile, UINT uCommand, DWORD_PTR dwData)
|
|
{
|
|
static HMODULE g_hmodHHCtrl;
|
|
static BOOL g_fTriedAndFailed;
|
|
|
|
if (!g_hmodHHCtrl && !g_fTriedAndFailed) {
|
|
char szHHCtrl[MAX_PATH];
|
|
if (GetRegisteredLocation(szHHCtrl))
|
|
g_hmodHHCtrl = LoadLibrary(szHHCtrl); // try registered location
|
|
if (!g_hmodHHCtrl)
|
|
g_hmodHHCtrl = LoadLibrary(txtHHCtrl);
|
|
if (g_hmodHHCtrl == NULL) {
|
|
g_fTriedAndFailed = TRUE;
|
|
return NULL;
|
|
}
|
|
}
|
|
if (!pHtmlHelpW) {
|
|
(FARPROC&) pHtmlHelpW = GetProcAddress(g_hmodHHCtrl, ATOM_HTMLHELP_API_UNICODE);
|
|
if (pHtmlHelpW == NULL) {
|
|
g_fTriedAndFailed = TRUE;
|
|
return NULL;
|
|
}
|
|
}
|
|
return pHtmlHelpW(hwndCaller, pszFile, uCommand, dwData);
|
|
}
|