// Simple module for using MLLoadLibrary(). // This cannot be merged with shared.cpp, because it uses shlwapi.h. which conflict with // come constant in shared.h // Created: 07/08/98 by YST #include "pch.hxx" #include #include #include "htmlhelp.h" #include "shared.h" #include "htmlhelp.h" #include typedef HINSTANCE (STDAPICALLTYPE *PFNMLLOADLIBARY)(LPCSTR lpLibFileName, HMODULE hModule, DWORD dwCrossCodePage); typedef int (STDAPICALLTYPE *PFNMLWINHELP)(HWND hWndCaller, LPCSTR lpszHelp, UINT uCommand, DWORD_PTR dwData); typedef HWND (STDAPICALLTYPE *PFNMLHTMLHELP)(HWND hWndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData, DWORD dwCrossCodePage); static const char c_szShlwapiDll[] = "shlwapi.dll"; static const char c_szDllGetVersion[] = "DllGetVersion"; static PFNMLWINHELP pfnWinHelp = NULL; static PFNMLHTMLHELP pfnHtmlHelp = NULL; static BOOL fWinHelChecked = FALSE; static BOOL fHtmlHelpChecked = FALSE; static BOOL fNT5 = FALSE; const OENONSTDCP OENonStdCPs[] = { // CodePage Read ReadMenu Title SendMenu SmSend Use SIO 50001, 50001, 50001, 0, 0, 0, 0, // General Autoselect 50932, 50932, 50932, 0, 0, 50220, 0, // Japanice Auto Select 50949, 50949, 50949, 949, 0, /*51*/949, 0, // Korean Auto Select // 50939, 50939, 50939, 0, 0, 0, 0, // Chinese Auto Select 51932, 51932, 51932, 0, 0, 50220, 0, // Japanice EUC 932, 932, 932, 0, 0, 50220, 0, // Japanice Shift-JIS 50225, 50225, 50225, 949, 0, 949, 0, // Korean ISO-2022-KR 50220, 50932, 0, 0, 50220, 50220, 0, // Japanice JIS 51949, 50949, 0, 949, 51949, 51949, 0, // Korean 949, 50949, 0, 0, 949, 949, 0, // Korean Windows 50221, 50932, 50932, 0, 0, 50220, 1, // Esc(I ISO-2022-JP 50222, 50932, 50932, 0, 0, 50220, 2, // Esc(J ISO-2022-JP 28598, 28598, 28598, 0, 0, 28598, 0, // Hebrew visual // 1255, 1255, 1255, 0, 0, 1255, 0, // Hebrew Windows 20127, 28591, 0, 0, 0, 28591, 0, // US-ASCII 862, 862, 862, 0, 0, 862, 0, // Hebrew OEM (DOS) 0, 0, 0, 0, 0, 0 }; HINSTANCE LoadLangDll(HINSTANCE hInstCaller, LPCSTR szDllName, BOOL fNT) { char szPath[MAX_PATH]; HINSTANCE hinstShlwapi; PFNMLLOADLIBARY pfn; DLLGETVERSIONPROC pfnVersion; int iEnd; DLLVERSIONINFO info; HINSTANCE hInst = NULL; hinstShlwapi = LoadLibrary(c_szShlwapiDll); if (hinstShlwapi != NULL) { pfnVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstShlwapi, c_szDllGetVersion); if (pfnVersion != NULL) { info.cbSize = sizeof(DLLVERSIONINFO); if (SUCCEEDED(pfnVersion(&info))) { if (info.dwMajorVersion >= 5) { pfn = (PFNMLLOADLIBARY)GetProcAddress(hinstShlwapi, MAKEINTRESOURCE(377)); if (pfn != NULL) hInst = pfn(szDllName, hInstCaller, (ML_NO_CROSSCODEPAGE)); } } } FreeLibrary(hinstShlwapi); } if ((NULL == hInst) && (GetModuleFileName(hInstCaller, szPath, ARRAYSIZE(szPath)))) { PathRemoveFileSpec(szPath); iEnd = lstrlen(szPath); szPath[iEnd++] = '\\'; lstrcpyn(&szPath[iEnd], szDllName, ARRAYSIZE(szPath)-iEnd); hInst = LoadLibrary(szPath); } AssertSz(hInst, "Failed to LoadLibrary Lang Dll"); return(hInst); } // Get system architecture and OS version BOOL GetPCAndOSTypes(SYSTEM_INFO * pSysInf, OSVERSIONINFO * pOsInf) { GetSystemInfo(pSysInf); pOsInf->dwOSVersionInfoSize = sizeof(OSVERSIONINFO); return(GetVersionEx(pOsInf)); } // PlugUI version of WinHelp BOOL OEWinHelp(HWND hWndCaller, LPCSTR lpszHelp, UINT uCommand, DWORD_PTR dwData) { if(!pfnWinHelp) { if(!fWinHelChecked) { HINSTANCE hinstShlwapi; PFNMLLOADLIBARY pfn; DLLGETVERSIONPROC pfnVersion; int iEnd; DLLVERSIONINFO info; HINSTANCE hInst = NULL; hinstShlwapi = DemandLoadShlWapi(); // hinstShlwapi = LoadLibrary(c_szShlwapiDll); if (hinstShlwapi != NULL) { pfnVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstShlwapi, c_szDllGetVersion); if (pfnVersion != NULL) { info.cbSize = sizeof(DLLVERSIONINFO); if (SUCCEEDED(pfnVersion(&info))) { if (info.dwMajorVersion >= 5) { // 395 is ordinal # fot MLWinHelp pfnWinHelp = (PFNMLWINHELP)GetProcAddress(hinstShlwapi, MAKEINTRESOURCE(395)); } } } // FreeLibrary(hinstShlwapi); } fWinHelChecked = TRUE; } if(pfnWinHelp) return(pfnWinHelp(hWndCaller, lpszHelp, uCommand, dwData)); else return(WinHelp(hWndCaller, lpszHelp, uCommand, dwData)); } else return(pfnWinHelp(hWndCaller, lpszHelp, uCommand, dwData)); } // PlugUI version of HtmlHelp HWND OEHtmlHelp(HWND hWndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData) { if(!pfnHtmlHelp) { if(!fHtmlHelpChecked) { HINSTANCE hinstShlwapi; PFNMLLOADLIBARY pfn; DLLGETVERSIONPROC pfnVersion; int iEnd; DLLVERSIONINFO info; HINSTANCE hInst = NULL; hinstShlwapi = DemandLoadShlWapi(); // hinstShlwapi = LoadLibrary(c_szShlwapiDll); if (hinstShlwapi != NULL) { pfnVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstShlwapi, c_szDllGetVersion); if (pfnVersion != NULL) { info.cbSize = sizeof(DLLVERSIONINFO); if (SUCCEEDED(pfnVersion(&info))) { if (info.dwMajorVersion >= 5) { // 396 is ordinal # fot MLHTMLHelp pfnHtmlHelp = (PFNMLHTMLHELP)GetProcAddress(hinstShlwapi, MAKEINTRESOURCE(396)); if(!fNT5) { OSVERSIONINFO OSInfo; OSInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&OSInfo); if((OSInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) && (OSInfo.dwMajorVersion >= 5)) fNT5 = TRUE; } } } } // FreeLibrary(hinstShlwapi); } fHtmlHelpChecked = TRUE; } if(pfnHtmlHelp) return(pfnHtmlHelp(hWndCaller, pszFile, uCommand, dwData, fNT5 ? ML_CROSSCODEPAGE_NT : ML_NO_CROSSCODEPAGE)); else return(HtmlHelp(hWndCaller, pszFile, uCommand, dwData)); } else return(pfnHtmlHelp(hWndCaller, pszFile, uCommand, dwData, fNT5 ? ML_CROSSCODEPAGE_NT : ML_NO_CROSSCODEPAGE)); }