[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:
Rafal Harabien 2012-01-12 16:32:02 +00:00
parent 6fa29d2d3a
commit a55d842965
2 changed files with 61 additions and 18 deletions

View file

@ -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

View file

@ -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 :