mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +00:00
[SHELL32]
- Fix first chance exception if application has no strings in version info - If Lang is not set use US English version info. Fixes WinRAR version info. - Applications has Description filed instead of Opens With - Load language in file version info svn path=/trunk/; revision=54925
This commit is contained in:
parent
6fa29d2d3a
commit
a55d842965
2 changed files with 61 additions and 18 deletions
|
@ -49,7 +49,7 @@ BOOL CFileVersionInfo::Load(LPCWSTR pwszPath)
|
||||||
|
|
||||||
LPLANGANDCODEPAGE lpLangCode;
|
LPLANGANDCODEPAGE lpLangCode;
|
||||||
UINT cBytes;
|
UINT cBytes;
|
||||||
if (!VerQueryValueW(m_pInfo, L"VarFileInfo\\Translation", (LPVOID *)&lpLangCode, &cBytes))
|
if (!VerQueryValueW(m_pInfo, L"\\VarFileInfo\\Translation", (LPVOID *)&lpLangCode, &cBytes) || cBytes < sizeof(LANGANDCODEPAGE))
|
||||||
{
|
{
|
||||||
ERR("VerQueryValueW failed\n");
|
ERR("VerQueryValueW failed\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -59,8 +59,10 @@ BOOL CFileVersionInfo::Load(LPCWSTR pwszPath)
|
||||||
* default to english
|
* default to english
|
||||||
* for now default to first available language
|
* for now default to first available language
|
||||||
*/
|
*/
|
||||||
m_wLang = lpLangCode->lang;
|
m_wLang = lpLangCode->wLang;
|
||||||
m_wCode = lpLangCode->code;
|
m_wCode = lpLangCode->wCode;
|
||||||
|
TRACE("Lang %hx Code %hu\n", m_wLang, m_wCode);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,10 +74,24 @@ LPCWSTR CFileVersionInfo::GetString(LPCWSTR pwszName)
|
||||||
WCHAR wszBuf[256];
|
WCHAR wszBuf[256];
|
||||||
swprintf(wszBuf, L"\\StringFileInfo\\%04x%04x\\%s", m_wLang, m_wCode, pwszName);
|
swprintf(wszBuf, L"\\StringFileInfo\\%04x%04x\\%s", m_wLang, m_wCode, pwszName);
|
||||||
|
|
||||||
|
/* Query string in version block */
|
||||||
LPCWSTR pwszResult = NULL;
|
LPCWSTR pwszResult = NULL;
|
||||||
UINT cBytes = 0;
|
UINT cBytes = 0;
|
||||||
if (!VerQueryValueW(m_pInfo, wszBuf, (LPVOID *)&pwszResult, &cBytes))
|
if (!VerQueryValueW(m_pInfo, wszBuf, (LPVOID *)&pwszResult, &cBytes))
|
||||||
return NULL;
|
pwszResult = NULL;
|
||||||
|
|
||||||
|
if (!m_wLang && !m_wCode)
|
||||||
|
{
|
||||||
|
/* Try US English */
|
||||||
|
swprintf(wszBuf, L"\\StringFileInfo\\%04x%04x\\%s", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 1252, pwszName);
|
||||||
|
if (!VerQueryValueW(m_pInfo, wszBuf, (LPVOID *)&pwszResult, &cBytes))
|
||||||
|
pwszResult = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pwszResult)
|
||||||
|
ERR("VerQueryValueW %ls failed\n", pwszName);
|
||||||
|
else
|
||||||
|
TRACE("%ls: %ls\n", pwszName, pwszResult);
|
||||||
|
|
||||||
return pwszResult;
|
return pwszResult;
|
||||||
}
|
}
|
||||||
|
@ -92,6 +108,20 @@ VS_FIXEDFILEINFO *CFileVersionInfo::GetFixedInfo()
|
||||||
return pInfo;
|
return pInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LPCWSTR CFileVersionInfo::GetLangName()
|
||||||
|
{
|
||||||
|
if (!m_pInfo)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!m_wszLang[0])
|
||||||
|
{
|
||||||
|
if (!VerLanguageNameW(m_wLang, m_wszLang, _countof(m_wszLang)))
|
||||||
|
ERR("VerLanguageNameW failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_wszLang;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
*
|
*
|
||||||
* SH_FormatFileSizeWithBytes
|
* SH_FormatFileSizeWithBytes
|
||||||
|
@ -499,9 +529,13 @@ CFileDefExt::InitGeneralPage(HWND hwndDlg)
|
||||||
InitOpensWithField(hwndDlg);
|
InitOpensWithField(hwndDlg);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SetDlgItemTextW(hwndDlg, 14006, L"Description:"); // FIXME
|
||||||
|
ShowWindow(GetDlgItem(hwndDlg, 140062), SW_HIDE);
|
||||||
LPCWSTR pwszDescr = m_VerInfo.GetString(L"FileDescription");
|
LPCWSTR pwszDescr = m_VerInfo.GetString(L"FileDescription");
|
||||||
if (pwszDescr)
|
if (pwszDescr)
|
||||||
SetDlgItemTextW(hwndDlg, 14007, pwszDescr);
|
SetDlgItemTextW(hwndDlg, 14007, pwszDescr);
|
||||||
|
else
|
||||||
|
SetDlgItemTextW(hwndDlg, 14007, PathFindFileNameW(m_wszPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set file created/modfied/accessed time */
|
/* Set file created/modfied/accessed time */
|
||||||
|
@ -571,7 +605,13 @@ CFileDefExt::InitVersionPage(HWND hwndDlg)
|
||||||
|
|
||||||
/* Add items to listbox */
|
/* Add items to listbox */
|
||||||
AddVersionString(hwndDlg, L"CompanyName");
|
AddVersionString(hwndDlg, L"CompanyName");
|
||||||
/* FIXME insert language identifier */
|
LPCWSTR pwszLang = m_VerInfo.GetLangName();
|
||||||
|
if (pwszLang)
|
||||||
|
{
|
||||||
|
HWND hDlgCtrl = GetDlgItem(hwndDlg, 14009);
|
||||||
|
UINT Index = SendMessageW(hDlgCtrl, LB_ADDSTRING, (WPARAM)-1, (LPARAM)L"Language");
|
||||||
|
SendMessageW(hDlgCtrl, LB_SETITEMDATA, (WPARAM)Index, (LPARAM)(WCHAR *)pwszLang);
|
||||||
|
}
|
||||||
AddVersionString(hwndDlg, L"ProductName");
|
AddVersionString(hwndDlg, L"ProductName");
|
||||||
AddVersionString(hwndDlg, L"InternalName");
|
AddVersionString(hwndDlg, L"InternalName");
|
||||||
AddVersionString(hwndDlg, L"OriginalFilename");
|
AddVersionString(hwndDlg, L"OriginalFilename");
|
||||||
|
@ -584,7 +624,8 @@ CFileDefExt::InitVersionPage(HWND hwndDlg)
|
||||||
/* Select first item */
|
/* Select first item */
|
||||||
HWND hDlgCtrl = GetDlgItem(hwndDlg, 14009);
|
HWND hDlgCtrl = GetDlgItem(hwndDlg, 14009);
|
||||||
SendMessageW(hDlgCtrl, LB_SETCURSEL, 0, 0);
|
SendMessageW(hDlgCtrl, LB_SETCURSEL, 0, 0);
|
||||||
LPCWSTR pwszText = (WCHAR *)SendMessageW(hDlgCtrl, LB_GETITEMDATA, (WPARAM)0, (LPARAM)NULL);
|
LPCWSTR pwszText = (LPCWSTR)SendMessageW(hDlgCtrl, LB_GETITEMDATA, (WPARAM)0, (LPARAM)NULL);
|
||||||
|
if (pwszText && pwszText != (LPCWSTR)LB_ERR)
|
||||||
SetDlgItemTextW(hwndDlg, 14010, pwszText);
|
SetDlgItemTextW(hwndDlg, 14010, pwszText);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -594,7 +635,7 @@ CFileDefExt::InitVersionPage(HWND hwndDlg)
|
||||||
*
|
*
|
||||||
* CFileDefExt::SetVersionLabel [Internal]
|
* CFileDefExt::SetVersionLabel [Internal]
|
||||||
*
|
*
|
||||||
*
|
* retrieves a version string and uses it to set label text
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
|
@ -620,7 +661,6 @@ CFileDefExt::SetVersionLabel(HWND hwndDlg, DWORD idCtrl, LPCWSTR pwszName)
|
||||||
* CFileDefExt::AddVersionString [Internal]
|
* CFileDefExt::AddVersionString [Internal]
|
||||||
*
|
*
|
||||||
* retrieves a version string and adds it to listbox
|
* retrieves a version string and adds it to listbox
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
|
|
|
@ -26,16 +26,20 @@ class CFileVersionInfo
|
||||||
private:
|
private:
|
||||||
PVOID m_pInfo;
|
PVOID m_pInfo;
|
||||||
WORD m_wLang, m_wCode;
|
WORD m_wLang, m_wCode;
|
||||||
|
WCHAR m_wszLang[64];
|
||||||
|
|
||||||
typedef struct _LANGANDCODEPAGE_
|
typedef struct _LANGANDCODEPAGE_
|
||||||
{
|
{
|
||||||
WORD lang;
|
WORD wLang;
|
||||||
WORD code;
|
WORD wCode;
|
||||||
} LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
|
} LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline CFileVersionInfo():
|
inline CFileVersionInfo():
|
||||||
m_pInfo(NULL), m_wLang(0), m_wCode(0) {}
|
m_pInfo(NULL), m_wLang(0), m_wCode(0)
|
||||||
|
{
|
||||||
|
m_wszLang[0] = L'\0';
|
||||||
|
}
|
||||||
|
|
||||||
inline ~CFileVersionInfo()
|
inline ~CFileVersionInfo()
|
||||||
{
|
{
|
||||||
|
@ -44,10 +48,9 @@ class CFileVersionInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL Load(LPCWSTR pwszPath);
|
BOOL Load(LPCWSTR pwszPath);
|
||||||
|
|
||||||
LPCWSTR GetString(LPCWSTR pwszName);
|
LPCWSTR GetString(LPCWSTR pwszName);
|
||||||
|
|
||||||
VS_FIXEDFILEINFO *GetFixedInfo();
|
VS_FIXEDFILEINFO *GetFixedInfo();
|
||||||
|
LPCWSTR GetLangName();
|
||||||
};
|
};
|
||||||
|
|
||||||
class CFileDefExt :
|
class CFileDefExt :
|
||||||
|
|
Loading…
Reference in a new issue