#ifndef _INC_MLUISUPP #define _INC_MLUISUPP #include #include #ifdef __cplusplus extern "C" { #endif //+------------------------------------------------------------------ // Multilang Pluggable UI support // inline functions defs (to centralize code) //+------------------------------------------------------------------ #ifdef UNICODE #define MLLoadString MLLoadStringW #define MLBuildResURLWrap MLBuildResURLWrapW #else #define MLLoadString MLLoadStringA #define MLBuildResURLWrap MLBuildResURLWrapA #endif #undef ML_ID_DIALOGCALLS BOOL _PathRemoveFileSpec(LPTSTR pFile); void MLLoadResources(HINSTANCE hinstParent, LPTSTR pszLocResDll); void MLFreeResources(HINSTANCE hinstParent); int MLLoadStringA(UINT id, LPSTR sz, UINT cchMax); int MLLoadStringW(UINT id, LPWSTR sz, UINT cchMax); HINSTANCE MLGetHinst(); INT_PTR MLDialogBoxWrap(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hwndParent, DLGPROC lpDialogFunc); INT_PTR MLDialogBoxParamWrap(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hwndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); HWND MLCreateDialogParamWrap(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hwndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); BOOL MLEndDialogWrap(HWND hDlg, INT_PTR nResult); HWND MLHtmlHelpWrap(HWND hwndCaller, LPCTSTR pszFile, UINT uCommand, DWORD dwData, DWORD dwCrossCodePage); BOOL MLWinHelpWrap(HWND hwndCaller, LPCTSTR lpszHelp, UINT uCommand, DWORD dwData); HRESULT MLBuildResURLWrapA(LPSTR pszLibFile, HMODULE hModule, DWORD dwCrossCodePage, LPSTR pszResName, LPSTR pszResURL, int nBufSize, LPSTR pszParentDll); HRESULT MLBuildResURLWrapW(LPWSTR pszLibFile, HMODULE hModule, DWORD dwCrossCodePage, LPWSTR pszResName, LPWSTR pszResURL, int nBufSize, LPWSTR pszParentDll); HWND SHHtmlHelpOnDemandWrap(HWND hwndCaller, LPCTSTR pszFile, UINT uCommand, DWORD_PTR dwData, DWORD dwCrossCodePage); BOOL SHWinHelpOnDemandWrap(HWND hwndCaller, LPCTSTR lpszHelp, UINT uCommand, DWORD_PTR dwData); // MLLoadLibrary is used for loading the various localized resource libraries // Note: MLLoadLibrary is exported without a name, only an ordinal # #ifndef UNICODE #define szMLLoadLibrary 377 //TEXT("MLLoadLibraryA"); #else #define szMLLoadLibrary 378 //TEXT("MLLoadLibraryW"); // for Unicode #endif #ifdef MLUI_INIT typedef HINSTANCE (STDAPICALLTYPE *PFNMLLOADLIBARY)(LPCSTR lpLibFileName, HMODULE hModule, DWORD dwCrossCodePage); static const char c_szShlwapiDll[] = "shlwapi.dll"; struct tagMLUI_INFO { HINSTANCE hinstLocRes; ULONG ulRefs; BOOL fMLEnabled; } g_mluiInfo = { NULL, 0 , FALSE }; static HINSTANCE LoadLangDll(HINSTANCE hInstCaller, LPCSTR szDllName) { char szPath[MAX_PATH]; HINSTANCE hinstShlwapi; PFNMLLOADLIBARY pfn; DWORD dwVerInfoSize, dwVerHnd; int iEnd; LPSTR lpInfo; HINSTANCE hInst = NULL; UINT uLen; VS_FIXEDFILEINFO *pinfo; hinstShlwapi = LoadLibrary(c_szShlwapiDll); if (hinstShlwapi != NULL) { if (GetModuleFileName(hinstShlwapi, szPath, ARRAYSIZE(szPath))) { if (dwVerInfoSize = GetFileVersionInfoSize(szPath, &dwVerHnd)) { if (MemAlloc((void **)&lpInfo, dwVerInfoSize)) { if (GetFileVersionInfo(szPath, dwVerHnd, dwVerInfoSize, lpInfo)) { if (VerQueryValue(lpInfo, "\\", (LPVOID *)&pinfo, &uLen) && uLen == sizeof(VS_FIXEDFILEINFO)) { if (pinfo->dwProductVersionMS >= 0x00050000) { pfn = (PFNMLLOADLIBARY)GetProcAddress(hinstShlwapi, MAKEINTRESOURCE(377)); if (pfn != NULL) hInst = pfn(szDllName, hInstCaller, 0); } } } MemFree(lpInfo); } } } 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); } void MLLoadResources(HINSTANCE hinstParent, LPTSTR pszLocResDll) { if (g_mluiInfo.hinstLocRes == NULL) { // find out whether ML is enabled or not #ifdef MLUI_SUPPORT g_mluiInfo.fMLEnabled = TRUE; #else g_mluiInfo.fMLEnabled = FALSE; #endif if (g_mluiInfo.fMLEnabled) { g_mluiInfo.ulRefs++; // g_mluiInfo.hinstLocRes = lpfnMLLoadLibrary(pszLocResDll, hinstParent, ML_CROSSCODEPAGE); g_mluiInfo.hinstLocRes = LoadLangDll(hinstParent, pszLocResDll); } else { g_mluiInfo.hinstLocRes = hinstParent; } } } void MLFreeResources(HINSTANCE hinstParent) { g_mluiInfo.ulRefs--; if (g_mluiInfo.hinstLocRes != NULL && g_mluiInfo.hinstLocRes != hinstParent && g_mluiInfo.ulRefs == 0 ) { FreeLibrary(g_mluiInfo.hinstLocRes); g_mluiInfo.hinstLocRes = NULL; } } int MLLoadStringA(UINT id, LPSTR sz, UINT cchMax) { return LoadStringA(g_mluiInfo.hinstLocRes, id, sz, cchMax); } int MLLoadStringW(UINT id, LPWSTR sz, UINT cchMax) { return LoadStringW(g_mluiInfo.hinstLocRes, id, sz, cchMax); // return LoadStringWrapW(g_mluiInfo.hinstLocRes, id, sz, cchMax); } HINSTANCE MLGetHinst() { return g_mluiInfo.hinstLocRes; } INT_PTR MLDialogBoxParamWrap(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hwndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { INT_PTR nRet; #ifdef ML_ID_DIALOGCALLS { nRet = MLDialogBoxParam(hInstance, (LPWSTR)lpTemplateName, hwndParent, lpDialogFunc, dwInitParam); } #else { nRet = DialogBoxParamWrapW(hInstance, lpTemplateName, hwndParent, lpDialogFunc, dwInitParam); } #endif return nRet; } BOOL MLEndDialogWrap(HWND hDlg, INT_PTR nResult) { BOOL fRet; #ifdef ML_ID_DIALOGCALLS { fRet = MLEndDialog(hDlg, nResult); } #else { fRet = EndDialog(hDlg, nResult); } #endif return fRet; } #endif // MLUI_INIT #ifdef __cplusplus }; #endif #endif // _INC_MLUISUPP