Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

247 lines
7.5 KiB

#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