Re: Alternative to 'AfxSetResourceHandle'
Martin,
below you will find the code I am using to localize my application.
Just replace my defined types by standard MFC (boolean_t = BOOL)
void CMainApp::LoadUIResources()
{
vlwGetLangResName( _T("Foo.dll"), m_hResourceInstance);
ASSERT( m_hResourceInstance );
}
Once an resource instance has been loaded
you can do CString sTmp.LoadString(hResourceInstance , IDS_YOUR_ID);
So I know it works for String resources.
About Other type of resources icon, bmp, you can use win32 calls:
HBITMAP hBmp = ::LoadBitmap(hResourceInstance , IDB_FOO);
//===========================================================//
// CODE TAKEN FROM MFC AND MODIFY TO USE A DIFFERENT NAMING
// CONVENTION. HERE WE USE .mui
//===========================================================//
typedef LANGID (WINAPI*PFNGETUSERDEFAULTUILANGUAGE)();
typedef LANGID (WINAPI*PFNGETSYSTEMDEFAULTUILANGUAGE)();
HINSTANCE vlwLoadLangDLL(LPCTSTR a_tszFormat, LCID a_lcid)
{
TCHAR tszLangDLL[VLW_MAX_PATH];
HINSTANCE hInstance;
int ret = _sntprintf( (TCHAR*)tszLangDLL, VLW_MAX_PATH,a_tszFormat,
a_lcid);
if( (ret == -1) || (ret >= VLW_MAX_PATH) ){
ASSERT(FALSE);
return NULL;
}
hInstance = ::LoadLibrary( tszLangDLL );
return hInstance;
}
Boolean_t vlwGetLangResName( LPCTSTR a_tszResName, HINSTANCE&
a_hResInst/*, LCID a_DefCode*/)
{
TCHAR l_tszFormat[VLW_MAX_PATH] = {0};
LANGID langid = 0;
int nPrimaryLang = 0;
int nSubLang = 0;
LCID lcid = 0;
PFNGETUSERDEFAULTUILANGUAGE pfnGetUserDefaultUILanguage = NULL;
PFNGETSYSTEMDEFAULTUILANGUAGE pfnGetSystemDefaultUILanguage = NULL;
HINSTANCE hKernel32 = NULL;
LCID alcidSearch[5];
int nLocales = 0;
HINSTANCE hLangDLL = NULL;
if ( (a_tszResName == NULL) ){
a_hResInst = 0;
return FALSE;
}
//Initialize parameters to 0
a_hResInst = 0;
// Build name format
_sntprintf(l_tszFormat, VLW_MAX_PATH, _T("%s.%%.4x.mui"), a_tszResName);
nLocales = 0;
hKernel32 = ::GetModuleHandle( _T("coredll.dll") );
ASSERT(hKernel32 != NULL);
pfnGetUserDefaultUILanguage =
(PFNGETUSERDEFAULTUILANGUAGE)::GetProcAddress(hKernel32,
_T("GetUserDefaultUILanguage") );
if(pfnGetUserDefaultUILanguage != NULL){
// First, try the user's UI language
langid = pfnGetUserDefaultUILanguage();
nPrimaryLang = PRIMARYLANGID(langid);
nSubLang = SUBLANGID(langid);
lcid = MAKELCID(MAKELANGID(nPrimaryLang, nSubLang), SORT_DEFAULT);
alcidSearch[nLocales] = ::ConvertDefaultLocale(lcid);
nLocales++;
lcid = MAKELCID(MAKELANGID(nPrimaryLang, SUBLANG_NEUTRAL), SORT_DEFAULT);
alcidSearch[nLocales] = ::ConvertDefaultLocale(lcid);
nLocales++;
// Then, try the system's default UI language
pfnGetSystemDefaultUILanguage =
(PFNGETSYSTEMDEFAULTUILANGUAGE)::GetProcAddress(hKernel32,
_T("GetSystemDefaultUILanguage") );
if( pfnGetSystemDefaultUILanguage != NULL ){
langid = pfnGetSystemDefaultUILanguage();
nPrimaryLang = PRIMARYLANGID(langid);
nSubLang = SUBLANGID(langid);
lcid = MAKELCID(MAKELANGID(nPrimaryLang, nSubLang), SORT_DEFAULT);
alcidSearch[nLocales] = ::ConvertDefaultLocale(lcid);
nLocales++;
lcid = MAKELCID(MAKELANGID(nPrimaryLang, SUBLANG_NEUTRAL),
SORT_DEFAULT);
alcidSearch[nLocales] = ::ConvertDefaultLocale(lcid);
nLocales++;
}
}
alcidSearch[nLocales] = LOCALE_SYSTEM_DEFAULT;
nLocales++;
for(int iLocale = 0; iLocale < nLocales; iLocale++)
{
hLangDLL = vlwLoadLangDLL(l_tszFormat, alcidSearch[iLocale]);
if(hLangDLL != NULL){
a_hResInst = hLangDLL;
return TRUE;
}
}
// If we are here we didn't find OS mui - try default (1033 = ENU-US)
hLangDLL = vlwLoadLangDLL(l_tszFormat, 1033);
if(hLangDLL != NULL){
a_hResInst = hLangDLL;
return TRUE;
}
//everything failed - last chance
hLangDLL = ::LoadLibrary( a_tszResName );
if(hLangDLL != NULL){
a_hResInst = hLangDLL;
return TRUE;
}
return FALSE;
}