248 lines
7.2 KiB
C
248 lines
7.2 KiB
C
|
#ifndef _INC_MLUISUPP
|
||
|
#define _INC_MLUISUPP
|
||
|
|
||
|
#include <shlwapi.h>
|
||
|
#include <shlwapip.h>
|
||
|
|
||
|
#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
|