问题描述:采用ini文件实现多语言功能,在xp表现正常,在vista下,通过网页调用,大多数语言正常,但是部分按钮语言错误
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // points to section name
LPCTSTR lpKeyName, // points to key name
LPCTSTR lpDefault, // points to default string
LPTSTR lpReturnedString, // points to destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // points to initialization filename
);
调试结果:采用GetPrivateProfileString读取ini文件,如果lpFileName为空,可能造成无法读取ini文件相应KeyName的值。
关于注册表的问题:读取注册表这段代码执行失败了,最后造成调用GetPrivateProfileString时,lpFileName路径为空
//读取语言类型
CRegKey reg;
LRESULT lResult = 0;
DWORD dwSize = 0;
TCHAR szValue[MAX_PATH];
DWORD dwValue;
WORD wLanguage; //未初始化也是一个问题
USES_CONVERSION;
TCHAR szKeyName[MAX_PATH];
_stprintf( szKeyName,_T("SOFTWARE//%s//%s//System"),GROUP_NAME,PRODUCT_NAME );
lResult = reg.Open( HKEY_LOCAL_MACHINE,szKeyName );
if( lResult == ERROR_SUCCESS ){
dwSize = MAX_PATH;
if (reg.QueryValue( dwValue,_T("wLanguage")) == ERROR_SUCCESS )
{
wLanguage = dwValue;
}
reg.Close();
}
if (wLanguage != NULL){
SetCurLanByCode( wLanguage );
}
else{
SetCurLanByCode( 936 );
}
考虑vista路径的影响,打算从注册表读取绝对路径,下面这段代码读取注册表的没问题,因没有环境调试,上面那段代码丢弃了,采取别的办法:
static TCHAR* GetInstallPath(LPCTSTR szGroupName, LPCTSTR szProductName)
{
static TCHAR szPath[MAX_PATH];
CRegKey reg;
LRESULT lResult = 0;
TCHAR szKeyName[MAX_PATH];
if( szGroupName && _tcslen(szGroupName ) > 0 ){
_stprintf( szKeyName,L"SOFTWARE//%s//%s",szGroupName,szProductName );
}else{
_stprintf( szKeyName,L"SOFTWARE//%s",szProductName );
}
lResult = reg.Open( HKEY_LOCAL_MACHINE,szKeyName );
if( lResult == ERROR_SUCCESS )
{
DWORD dwCount = sizeof(szPath);
if( reg.QueryValue( szPath,_T("FilePath"),&dwCount ) == ERROR_SUCCESS )
{
TCHAR *psz = _tcsrchr(szPath,'//');
*(psz+1) = '/0';
return szPath;
}
}
return NULL;
}