1 | //////////////////////////////////////////////////////////// |
---|
2 | // Copyright (C) Roman Ryltsov, 2008-2012 |
---|
3 | // Created by Roman Ryltsov roman@alax.info |
---|
4 | // |
---|
5 | // $Id: ListResourceLanguages.cpp 58 2012-04-20 13:03:26Z roman $ |
---|
6 | |
---|
7 | #include "stdafx.h" |
---|
8 | |
---|
9 | /////////////////////////////////////////////////////////// |
---|
10 | // CModule |
---|
11 | |
---|
12 | class CModule |
---|
13 | { |
---|
14 | public: |
---|
15 | |
---|
16 | //////////////////////////////////////////////////////// |
---|
17 | // CLanguageData |
---|
18 | |
---|
19 | class CLanguageData |
---|
20 | { |
---|
21 | public: |
---|
22 | SIZE_T m_nCount; |
---|
23 | |
---|
24 | public: |
---|
25 | // CLanguageData |
---|
26 | CLanguageData() throw() : |
---|
27 | m_nCount(0) |
---|
28 | { |
---|
29 | } |
---|
30 | }; |
---|
31 | |
---|
32 | private: |
---|
33 | CAtlMap<WORD, CLanguageData> m_LanguageDataMap; |
---|
34 | |
---|
35 | static CString GetLanguageName(LANGID nLanguage) |
---|
36 | { |
---|
37 | const UINT nPrimaryLanguage = PRIMARYLANGID(nLanguage); |
---|
38 | // TODO: Use sublang |
---|
39 | switch(nPrimaryLanguage) |
---|
40 | { |
---|
41 | case LANG_NEUTRAL: return _T("Neutral"); |
---|
42 | case LANG_INVARIANT: return _T("Invariant"); |
---|
43 | case LANG_AFRIKAANS: return _T("Afrikaans"); |
---|
44 | case LANG_ALBANIAN: return _T("Albanian"); |
---|
45 | case LANG_ARABIC: return _T("Arabic"); |
---|
46 | case LANG_ARMENIAN: return _T("Armenian"); |
---|
47 | case LANG_ASSAMESE: return _T("Assamese"); |
---|
48 | case LANG_AZERI: return _T("Azeri"); |
---|
49 | case LANG_BASQUE: return _T("Basque"); |
---|
50 | case LANG_BELARUSIAN: return _T("Belarusian"); |
---|
51 | case LANG_BENGALI: return _T("Bengali"); |
---|
52 | case LANG_BULGARIAN: return _T("Bulgarian"); |
---|
53 | case LANG_CATALAN: return _T("Catalan"); |
---|
54 | case LANG_CHINESE: return _T("Chinese"); |
---|
55 | case LANG_CROATIAN: return _T("Croatian/Serbian"); |
---|
56 | case LANG_CZECH: return _T("Czech"); |
---|
57 | case LANG_DANISH: return _T("Danish"); |
---|
58 | case LANG_DIVEHI: return _T("Divehi"); |
---|
59 | case LANG_DUTCH: return _T("Dutch"); |
---|
60 | case LANG_ENGLISH: return _T("English"); |
---|
61 | case LANG_ESTONIAN: return _T("Estonian"); |
---|
62 | case LANG_FAEROESE: return _T("Faeroese"); |
---|
63 | case LANG_FARSI: return _T("Farsi"); |
---|
64 | case LANG_FINNISH: return _T("Finnish"); |
---|
65 | case LANG_FRENCH: return _T("French"); |
---|
66 | case LANG_GALICIAN: return _T("Galician"); |
---|
67 | case LANG_GEORGIAN: return _T("Georgian"); |
---|
68 | case LANG_GERMAN: return _T("German"); |
---|
69 | case LANG_GREEK: return _T("Greek"); |
---|
70 | case LANG_GUJARATI: return _T("Gujarati"); |
---|
71 | case LANG_HEBREW: return _T("Hebrew"); |
---|
72 | case LANG_HINDI: return _T("Hindi"); |
---|
73 | case LANG_HUNGARIAN: return _T("Hungarian"); |
---|
74 | case LANG_ICELANDIC: return _T("Icelandic"); |
---|
75 | case LANG_INDONESIAN: return _T("Indonesian"); |
---|
76 | case LANG_ITALIAN: return _T("Italian"); |
---|
77 | case LANG_JAPANESE: return _T("Japanese"); |
---|
78 | case LANG_KANNADA: return _T("Kannada"); |
---|
79 | case LANG_KASHMIRI: return _T("Kashmiri"); |
---|
80 | case LANG_KAZAK: return _T("Kazak"); |
---|
81 | case LANG_KONKANI: return _T("Konkani"); |
---|
82 | case LANG_KOREAN: return _T("Korean"); |
---|
83 | case LANG_KYRGYZ: return _T("Kyrgyz"); |
---|
84 | case LANG_LATVIAN: return _T("Latvian"); |
---|
85 | case LANG_LITHUANIAN: return _T("Lithuanian"); |
---|
86 | case LANG_MACEDONIAN: return _T("Macedonian"); |
---|
87 | case LANG_MALAY: return _T("Malay"); |
---|
88 | case LANG_MALAYALAM: return _T("Malayalam"); |
---|
89 | case LANG_MANIPURI: return _T("Manipuri"); |
---|
90 | case LANG_MARATHI: return _T("Marathi"); |
---|
91 | case LANG_MONGOLIAN: return _T("Mongolian"); |
---|
92 | case LANG_NEPALI: return _T("Nepali"); |
---|
93 | case LANG_NORWEGIAN: return _T("Norwegian"); |
---|
94 | case LANG_ORIYA: return _T("Oriya"); |
---|
95 | case LANG_POLISH: return _T("Polish"); |
---|
96 | case LANG_PORTUGUESE: return _T("Portuguese"); |
---|
97 | case LANG_PUNJABI: return _T("Punjabi"); |
---|
98 | case LANG_ROMANIAN: return _T("Romanian"); |
---|
99 | case LANG_RUSSIAN: return _T("Russian"); |
---|
100 | case LANG_SANSKRIT: return _T("Sanskrit"); |
---|
101 | // case LANG_SERBIAN: return _T("Serbian"); == LANG_CROATIAN |
---|
102 | case LANG_SINDHI: return _T("Sindhi"); |
---|
103 | case LANG_SLOVAK: return _T("Slovak"); |
---|
104 | case LANG_SLOVENIAN: return _T("Slovenian"); |
---|
105 | case LANG_SPANISH: return _T("Spanish"); |
---|
106 | case LANG_SWAHILI: return _T("Swahili"); |
---|
107 | case LANG_SWEDISH: return _T("Swedish"); |
---|
108 | case LANG_SYRIAC: return _T("Syriac"); |
---|
109 | case LANG_TAMIL: return _T("Tamil"); |
---|
110 | case LANG_TATAR: return _T("Tatar"); |
---|
111 | case LANG_TELUGU: return _T("Telugu"); |
---|
112 | case LANG_THAI: return _T("Thai"); |
---|
113 | case LANG_TURKISH: return _T("Turkish"); |
---|
114 | case LANG_UKRAINIAN: return _T("Ukrainian"); |
---|
115 | case LANG_URDU: return _T("Urdu"); |
---|
116 | case LANG_UZBEK: return _T("Uzbek"); |
---|
117 | case LANG_VIETNAMESE: return _T("Vietnamese"); |
---|
118 | } |
---|
119 | return _T("???"); |
---|
120 | } |
---|
121 | BOOL EnumResourceLanguageProc(HMODULE hModule, LPCTSTR pszType, LPCTSTR pszName, WORD nLanguage) |
---|
122 | { |
---|
123 | hModule; pszType; pszName; |
---|
124 | m_LanguageDataMap[nLanguage].m_nCount++; |
---|
125 | return TRUE; |
---|
126 | } |
---|
127 | static BOOL WINAPI EnumResourceLanguageProc(HMODULE hModule, LPCTSTR pszType, LPCTSTR pszName, WORD nLanguage, LONG_PTR nParameter) |
---|
128 | { |
---|
129 | return ((CModule*) nParameter)->EnumResourceLanguageProc(hModule, pszType, pszName, nLanguage); |
---|
130 | } |
---|
131 | BOOL EnumResourceNameProc(HMODULE hModule, LPCTSTR pszType, LPTSTR pszName) |
---|
132 | { |
---|
133 | EnumResourceLanguages(hModule, pszType, pszName, EnumResourceLanguageProc, (LONG_PTR) this); |
---|
134 | return TRUE; |
---|
135 | } |
---|
136 | static BOOL WINAPI EnumResourceNameProc(HMODULE hModule, LPCTSTR pszType, LPTSTR pszName, LONG_PTR nParameter) |
---|
137 | { |
---|
138 | return ((CModule*) nParameter)->EnumResourceNameProc(hModule, pszType, pszName); |
---|
139 | } |
---|
140 | BOOL EnumResourceTypeProc(HMODULE hModule, LPTSTR pszType) |
---|
141 | { |
---|
142 | EnumResourceNames(hModule, pszType, EnumResourceNameProc, (LONG_PTR) this); |
---|
143 | return TRUE; |
---|
144 | } |
---|
145 | static BOOL WINAPI EnumResourceTypeProc(HMODULE hModule, LPTSTR pszType, LONG_PTR nParameter) |
---|
146 | { |
---|
147 | return ((CModule*) nParameter)->EnumResourceTypeProc(hModule, pszType); |
---|
148 | } |
---|
149 | |
---|
150 | public: |
---|
151 | // CModule |
---|
152 | SIZE_T ProcessFile(const CPath& sFilePath) |
---|
153 | { |
---|
154 | ATLASSERT(m_LanguageDataMap.IsEmpty()); |
---|
155 | const HMODULE hModule = LoadLibraryEx(sFilePath, NULL, LOAD_LIBRARY_AS_DATAFILE); |
---|
156 | ATLENSURE_THROW(hModule >= (HMODULE) HINSTANCE_ERROR, AtlHresultFromLastError()); |
---|
157 | _ATLTRY |
---|
158 | { |
---|
159 | EnumResourceTypes(hModule, (ENUMRESTYPEPROC) EnumResourceTypeProc, (LONG_PTR) this); |
---|
160 | } |
---|
161 | _ATLCATCHALL() |
---|
162 | { |
---|
163 | FreeLibrary(hModule); |
---|
164 | _ATLRETHROW; |
---|
165 | } |
---|
166 | FreeLibrary(hModule); |
---|
167 | #pragma region Output |
---|
168 | for(POSITION Position = m_LanguageDataMap.GetStartPosition(); Position; m_LanguageDataMap.GetNext(Position)) |
---|
169 | { |
---|
170 | const WORD nLanguage = m_LanguageDataMap.GetKeyAt(Position); |
---|
171 | const CLanguageData& LanguageData = m_LanguageDataMap.GetValueAt(Position); |
---|
172 | _tprintf(_T("%d\t%s\t%d\n"), nLanguage, GetLanguageName(nLanguage), LanguageData.m_nCount); |
---|
173 | } |
---|
174 | #pragma endregion |
---|
175 | return m_LanguageDataMap.GetCount(); |
---|
176 | } |
---|
177 | }; |
---|
178 | |
---|
179 | //////////////////////////////////////////////////////////// |
---|
180 | // Main |
---|
181 | |
---|
182 | int _tmain(int argc, _TCHAR* argv[]) |
---|
183 | { |
---|
184 | INT nResult; |
---|
185 | CModule Module; |
---|
186 | _ATLTRY |
---|
187 | { |
---|
188 | if(argc < 2) |
---|
189 | { |
---|
190 | _tprintf(_T("Syntax: ListResourceLanguages <path>\n")); |
---|
191 | return 0; |
---|
192 | } |
---|
193 | CPath sPath = argv[1]; |
---|
194 | nResult = (INT) Module.ProcessFile(sPath); |
---|
195 | } |
---|
196 | _ATLCATCH(Exception) |
---|
197 | { |
---|
198 | _tprintf(_T("Fatal: Error 0x%08x\n"), (HRESULT) Exception); |
---|
199 | return (HRESULT) Exception; |
---|
200 | } |
---|
201 | _ATLCATCHALL() |
---|
202 | { |
---|
203 | _tprintf(_T("Fatal: Fatal error\n")); |
---|
204 | return E_FAIL; //E_UNNAMED; |
---|
205 | } |
---|
206 | return nResult; |
---|
207 | } |
---|
208 | |
---|