XMLResource.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:16k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XMLResource.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "Common/XTPPropExchange.h"
  5. #include "Common/XTPResourceManager.h"
  6. #include "Common/XTPVC80Helpers.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // The one and only application object
  14. CWinApp theApp;
  15. using namespace std;
  16. struct RESOURCE_LANGUAGE
  17. {
  18. CString strEncoding;
  19. CString strLangauge;
  20. long wLanguage;
  21. };
  22. AFX_INLINE int REPLACEW_S(LPWSTR strReplace, LPCWSTR lpszOld, LPCWSTR lpszNew)
  23. {
  24. int nOldLength = (strReplace == NULL) ? 0 : (int)wcslen(strReplace);
  25. int nSourceLen = (lpszOld == NULL) ? 0 : (int)wcslen(lpszOld);
  26. if (nSourceLen == 0 || nOldLength == 0)
  27. return 0;
  28. int nReplacementLen = (lpszNew == NULL) ? 0 : (int)wcslen(lpszNew);
  29. // loop once to figure out the size of the result string
  30. int nCount = 0;
  31. LPWSTR lpszStart = strReplace;
  32. LPWSTR lpszTarget;
  33. while ((lpszTarget = wcsstr(lpszStart, lpszOld)) != NULL)
  34. {
  35. nCount++;
  36. lpszStart = lpszTarget + nSourceLen;
  37. }
  38. // if any changes were made, make them
  39. if (nCount > 0)
  40. {
  41. int nNewLength = nOldLength + (nReplacementLen-nSourceLen)*nCount;
  42. //ASSERT(nNewLength <= nOldLength); // not implemented
  43. lpszStart = strReplace;
  44. // loop again to actually do the work
  45. while ((lpszTarget = wcsstr(lpszStart, lpszOld)) != NULL)
  46. {
  47. int nBalance = nOldLength - int(lpszTarget - strReplace + nSourceLen);
  48. MEMMOVE_S(lpszTarget + nReplacementLen, lpszTarget + nSourceLen,
  49. nBalance * sizeof(WORD));
  50. MEMCPY_S(lpszTarget, lpszNew, nReplacementLen*sizeof(WORD));
  51. lpszStart = lpszTarget + nReplacementLen;
  52. lpszStart[nBalance] = '';
  53. nOldLength += (nReplacementLen - nSourceLen);
  54. }
  55. ASSERT(strReplace[nNewLength] == '');
  56. }
  57. return nCount;
  58. }
  59. void PreformatString(LPWSTR strValue)
  60. {
  61. REPLACEW_S(strValue, L"\", L"\\");
  62. REPLACEW_S(strValue, L"n", L"\n");
  63. REPLACEW_S(strValue, L"r", L"\r");
  64. REPLACEW_S(strValue, L"t", L"\t");
  65. }
  66. BOOL FindLanguage(RESOURCE_LANGUAGE* p, WORD wLanguage)
  67. {
  68. struct {
  69. WORD wLanguage;
  70. LPCTSTR lpszEncoding;
  71. LPCTSTR lpszCaption;
  72. }
  73. encoding[] = 
  74. {
  75. {MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), _T("windows-1251"), _T("Russian")},
  76. {MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), _T("shift-jis"), _T("Japanese")},
  77. {MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA), _T("windows-1256"), _T("Arabic (Saudi Arabia)")},
  78. {MAKELANGID(LANG_CZECH, SUBLANG_DEFAULT), _T("windows-1250"), _T("Czech")},
  79. {MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT), _T("windows-1252"), _T("Danish")},
  80. {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), _T("windows-1252"), _T("German (Germany)")},
  81. {MAKELANGID(LANG_GREEK, SUBLANG_DEFAULT), _T("windows-1253"), _T("Greek")},
  82. {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), _T("windows-1252"), _T("English (United States)")},
  83. {MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), _T("windows-1252"), _T("Spanish (Spain - Modern Sort)")},
  84. {MAKELANGID(LANG_ESTONIAN, SUBLANG_DEFAULT), _T("windows-1257"), _T("Estonian")},
  85. {MAKELANGID(LANG_FINNISH, SUBLANG_DEFAULT), _T("windows-1252"), _T("Finnish")},
  86. {MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH), _T("windows-1252"), _T("French (France)")},
  87. {MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT), _T("windows-1255"), _T("Hebrew")},
  88. {MAKELANGID(LANG_CROATIAN, SUBLANG_DEFAULT), _T("windows-1250"), _T("Croatian")},
  89. {MAKELANGID(LANG_HUNGARIAN, SUBLANG_DEFAULT), _T("windows-1250"), _T("Hungarian")},
  90. {MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN), _T("windows-1252"), _T("Italian (Italy)")},
  91. {MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT),  _T("ks_c_5601"), _T("Korean")},
  92. {MAKELANGID(LANG_LITHUANIAN, SUBLANG_LITHUANIAN), _T("windows-1257"), _T("Lithuanian")},
  93. {MAKELANGID(LANG_LATVIAN, SUBLANG_DEFAULT), _T("windows-1257"), _T("Latvian")},
  94. {MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH), _T("windows-1252"), _T("Dutch")},
  95. {MAKELANGID(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL), _T("windows-1252"), _T("Norwegian (Bokmal)")},
  96. {MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT), _T("windows-1250"), _T("Polish")},
  97. {MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE), _T("windows-1252"), _T("Portuguese (Portugal)")},
  98. {MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN), _T("windows-1252"), _T("Portuguese (Brazil)")},
  99. {MAKELANGID(LANG_ROMANIAN, SUBLANG_DEFAULT), _T("windows-1250"), _T("Romanian")},
  100. {MAKELANGID(LANG_SLOVAK, SUBLANG_DEFAULT), _T("windows-1250"), _T("Slovak")},
  101. {MAKELANGID(LANG_SLOVENIAN, SUBLANG_DEFAULT), _T("windows-1250"), _T("Slovenian")},
  102. {MAKELANGID(LANG_SWEDISH, SUBLANG_DEFAULT), _T("windows-1252"), _T("Swedish")},
  103. {MAKELANGID(LANG_THAI, SUBLANG_DEFAULT), _T("windows-874"), _T("Thai")},
  104. {MAKELANGID(LANG_TURKISH, SUBLANG_DEFAULT), _T("windows-1254"), _T("Turkish")},
  105. {MAKELANGID(LANG_UKRAINIAN, SUBLANG_DEFAULT), _T("windows-1251"), _T("Ukrainian ")},
  106. {MAKELANGID(LANG_BULGARIAN, SUBLANG_DEFAULT), _T("windows-1251"), _T("Bulgarian")},
  107. {MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), _T("gb2312"), _T("Chinese (PRC)")},
  108. {MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), _T("big5"), _T("Chinese (Taiwan)")}
  109. };
  110. for (int i = 0; i < _countof(encoding); i++)
  111. {
  112. if (encoding[i].wLanguage == wLanguage)
  113. {
  114. p->strEncoding = encoding[i].lpszEncoding;
  115. p->strLangauge = encoding[i].lpszCaption;
  116. p->wLanguage = wLanguage;
  117. return TRUE;
  118. }
  119. }
  120. return FALSE;
  121. }
  122. ULONG_PTR AlignDWord(ULONG_PTR uLong)  {  return ((uLong + 3) & ~3); }
  123. void PX_StringW(CXTPPropExchange* pPX, LPCTSTR pszPropName, LPWSTR str, LPWSTR lpDefault = 0)
  124. {
  125. if (!str || str[0] == 0)
  126. return;
  127. WORD dwLength = wcslen(str);
  128. LPWSTR lpwString = new WCHAR[(dwLength + 1) * 2 * 2];
  129. memcpy(lpwString, str, (dwLength + 1) * 2);
  130. PreformatString(lpwString);
  131. BSTR bstrValue = (BSTR)lpwString;
  132. PX_Bstr(pPX, pszPropName, bstrValue, (BSTR)lpDefault);
  133. BSTR bstrString = (BSTR)lpwString;
  134. delete[] lpwString;
  135. }
  136. void PutDialogTemplate(CXTPPropExchange* pPX, DLGTEMPLATE* pTemplate)
  137. {
  138. DLGTEMPLATEEX* pTemplateEx = (DLGTEMPLATEEX*)pTemplate;
  139. BOOL bTemplateEx = pTemplateEx->signature == 0xFFFF;
  140. int style, styleex, x, y, cx, cy, id;
  141. LPWORD pItems;
  142. if (bTemplateEx)
  143. {
  144. style = pTemplateEx->style;
  145. styleex = pTemplateEx->exStyle;
  146. x = pTemplateEx->x;
  147. y = pTemplateEx->y;
  148. cx = pTemplateEx->cx;
  149. cy = pTemplateEx->cy;
  150. pItems = (LPWORD)((LPBYTE)pTemplate + sizeof(DLGTEMPLATEEX));
  151. }
  152. else
  153. {
  154. style = pTemplate->style;
  155. styleex = pTemplate->dwExtendedStyle;
  156. x = pTemplate->x;
  157. y = pTemplate->y;
  158. cx = pTemplate->cx;
  159. cy = pTemplate->cy;
  160. pItems = (LPWORD)((LPBYTE)pTemplate + sizeof(DLGTEMPLATE));
  161. }
  162. ASSERT(*pItems == 0);
  163. ASSERT(*(pItems + 1) == 0);
  164. pItems += 2;
  165. if (pItems)
  166. {
  167. PX_StringW(pPX, _T("caption"), (LPWSTR)pItems);
  168. pItems += wcslen((LPWSTR)pItems);
  169. }
  170. pItems += 1;
  171. if (style & DS_SETFONT)
  172. {
  173. int nHeight = *pItems;
  174. PX_Int(pPX, _T("fontsize"), nHeight, 8);
  175. pItems += bTemplateEx? 3: 1;
  176. PX_StringW(pPX, _T("fontface"), (LPWSTR)pItems, L"MS Sans Serif");
  177. pItems += wcslen((LPWSTR)pItems) + 1;
  178. }
  179. CString strPos;
  180. strPos.Format(_T("%i, %i, %i, %i"), x, y, cx, cy);
  181. PX_Int(pPX, _T("style"), style);
  182. PX_Int(pPX, _T("styleex"), styleex, 0);
  183. PX_String(pPX, _T("position"), strPos);
  184. pItems = LPWORD((LPBYTE)pTemplate + AlignDWord((LPBYTE)pItems - (LPBYTE)pTemplate));
  185. CXTPPropExchangeEnumeratorPtr secControl(pPX->GetEnumerator(_T("control")));
  186. POSITION pos = secControl->GetPosition(32000);
  187. int nCount = bTemplateEx? pTemplateEx->cDlgItems:  pTemplate->cdit;
  188. for (int i = 0; i < nCount; i++)
  189. {
  190. DLGITEMTEMPLATE* pItemTemplate = (DLGITEMTEMPLATE*)pItems;
  191. DLGITEMTEMPLATEEX* pItemTemplateEx = (DLGITEMTEMPLATEEX*)pItems;
  192. CXTPPropExchangeSection sec(secControl->GetNext(pos));
  193. if (bTemplateEx)
  194. {
  195. style = pItemTemplateEx->style;
  196. styleex = pItemTemplateEx->exStyle;
  197. x = pItemTemplateEx->x;
  198. y = pItemTemplateEx->y;
  199. cx = pItemTemplateEx->cx;
  200. cy = pItemTemplateEx->cy;
  201. id = pItemTemplateEx->id;
  202. pItems = LPWORD((LPBYTE)pItemTemplate + sizeof(DLGITEMTEMPLATEEX));
  203. }
  204. else
  205. {
  206. style = pItemTemplate->style;
  207. styleex = pItemTemplate->dwExtendedStyle;
  208. x = pItemTemplate->x;
  209. y = pItemTemplate->y;
  210. cx = pItemTemplate->cx;
  211. cy = pItemTemplate->cy;
  212. id = pItemTemplate->id;
  213. pItems = LPWORD((LPBYTE)pItemTemplate + sizeof(DLGITEMTEMPLATE));
  214. }
  215. CString strPos;
  216. strPos.Format(_T("%i, %i, %i, %i"), x, y, cx, cy);
  217. if (id == 65535 || id == -1) id = 0;
  218. PX_Int(&sec, _T("id"), id, 0);
  219. CString strClass;
  220. if (*pItems == 0xFFFF)
  221. {
  222. switch (*(pItems + 1))
  223. {
  224. case 0x0080: strClass = _T("BUTTON"); break;
  225. case 0x0081: strClass = _T("EDIT"); break;
  226. case 0x0082: strClass = _T("STATIC"); break;
  227. case 0x0083: strClass = _T("LISTBOX"); break;
  228. case 0x0084: strClass = _T("SCROLLBAR"); break;
  229. case 0x0085: strClass = _T("COMBOBOX"); break;
  230. }
  231. pItems += 2;
  232. }
  233. else
  234. {
  235. strClass  = (LPWSTR)pItems;
  236. pItems += strClass.GetLength() + 1;
  237. }
  238. PX_String(&sec, _T("class"), strClass, _T("STATIC"));
  239. if (*pItems == 0xFFFF)
  240. {
  241. int nResource = *(pItems + 1);
  242. PX_Int(&sec, _T("resource"), nResource);
  243. pItems += 2;
  244. }
  245. else
  246. {
  247. PX_StringW(&sec, _T("caption"), (LPWSTR)pItems);
  248. pItems += wcslen((LPWSTR)pItems) + 1;
  249. }
  250. PX_Int(&sec, _T("style"), style, WS_CHILD | WS_VISIBLE | WS_GROUP);
  251. PX_Int(&sec, _T("styleex"), styleex, 0);
  252. PX_String(&sec, _T("position"), strPos);
  253. ASSERT(*pItems == 0);
  254. pItems += 1;
  255. pItems = LPWORD((LPBYTE)pItemTemplate + AlignDWord((LPBYTE)pItems - (LPBYTE)pItemTemplate));
  256. }
  257. }
  258. void PutMenuItems(CXTPPropExchange* pPX, MENUITEMTEMPLATE*& pItem)
  259. {
  260. CXTPPropExchangeEnumeratorPtr secMenuItem(pPX->GetEnumerator(_T("menuitem")));
  261. POSITION posMenuItem = secMenuItem->GetPosition(32000);
  262. while (TRUE)
  263. {
  264. CXTPPropExchangeSection sec(secMenuItem->GetNext(posMenuItem));
  265. BOOL bPopup = (pItem->mtOption & MF_POPUP) != 0;
  266. BOOL bEnd = (pItem->mtOption & MF_END) != 0;
  267. int nID = !bPopup? (int)pItem->mtID: 0;
  268. PX_Int(&sec, _T("id"), nID, 0);
  269. int nCaptionSize = (int)wcslen(bPopup? pItem->mtString - 1: pItem->mtString);
  270. WCHAR* pCaption = !bPopup? pItem->mtString: (WCHAR*)&pItem->mtID;
  271. if (pCaption)
  272. {
  273. PX_StringW(&sec, _T("caption"), pCaption);
  274. }
  275. pItem = (MENUITEMTEMPLATE*)((LPBYTE)pItem + (pItem->mtOption & MF_POPUP? sizeof(WORD) * 2: sizeof(WORD) * 3) + (nCaptionSize) * 2);
  276. if (bPopup)
  277. {
  278. PutMenuItems(&sec, pItem);
  279. }
  280. if (bEnd) break;
  281. }
  282. }
  283. struct PROPEXCHANGEENUM
  284. {
  285. CXTPPropExchangeEnumerator* pEnumerator;
  286. POSITION pos;
  287. }; 
  288. BOOL CALLBACK EnumResStringProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)
  289. {
  290. PROPEXCHANGEENUM* pxEnum = (PROPEXCHANGEENUM*)lParam;
  291. ASSERT(pxEnum);
  292. if (!pxEnum)
  293. return FALSE;
  294. HRSRC hRsrc = FindResource(hModule, lpszName, lpszType);
  295. if (!hRsrc)
  296. return FALSE;
  297. HGLOBAL hRsrcData = LoadResource(hModule, hRsrc);
  298. LPWSTR lpszData = (LPWSTR)LockResource(hRsrcData);
  299. for (int i = 0; i < 16; i++)
  300. {
  301. if (*lpszData)
  302. {
  303. CXTPPropExchangeSection sec(pxEnum->pEnumerator->GetNext(pxEnum->pos));
  304. WORD dwLength = *lpszData;
  305. LPWSTR lpwString = new WCHAR[(dwLength + 1) * 2 * 2];
  306. memcpy(lpwString, lpszData + 1, dwLength * 2);
  307. lpwString[dwLength] = 0;
  308. PreformatString(lpwString);
  309. BSTR bstrString = (BSTR)lpwString;
  310. int nResource = (((UINT)(UINT_PTR)lpszName - 1) * 16 + i);
  311. PX_Int(&sec, _T("id"), nResource);
  312. PX_Bstr(&sec, _T("value"), bstrString, 0);
  313. delete[] lpwString;
  314. lpszData = lpszData + dwLength + 1;
  315. }
  316. else
  317. {
  318. lpszData += 1;
  319. }
  320. }
  321. return TRUE;
  322. }
  323. void ConvertStrings(HMODULE hModule, CXTPPropExchange* pPX)
  324. {
  325. PROPEXCHANGEENUM pxenum;
  326. pxenum.pEnumerator = pPX->GetEnumerator(_T("string"));
  327. pxenum.pos = pxenum.pEnumerator->GetPosition(32000);
  328. ::EnumResourceNames(hModule, RT_STRING, &EnumResStringProc, (LONG_PTR)&pxenum);
  329. delete pxenum.pEnumerator;
  330. }
  331. BOOL CALLBACK EnumResMenuProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)
  332. {
  333. PROPEXCHANGEENUM* pxEnum = (PROPEXCHANGEENUM*)lParam;
  334. ASSERT(pxEnum);
  335. if (!pxEnum)
  336. return FALSE;
  337. HRSRC hRsrc = FindResource(hModule, lpszName, lpszType);
  338. if (!hRsrc)
  339. return FALSE;
  340. HGLOBAL hRsrcData = LoadResource(hModule, hRsrc);
  341. LPBYTE lpszData = (LPBYTE)LockResource(hRsrcData);
  342. CXTPPropExchangeSection sec(pxEnum->pEnumerator->GetNext(pxEnum->pos));
  343. int nResource = (UINT)(UINT_PTR)lpszName;
  344. PX_Int(&sec, _T("id"), nResource);
  345. lpszData += 4;
  346. MENUITEMTEMPLATE* pItem = (MENUITEMTEMPLATE*)lpszData;
  347. PutMenuItems(&sec, pItem);
  348. return TRUE;
  349. }
  350. void ConvertMenus(HMODULE hModule, CXTPPropExchange* pPX)
  351. {
  352. PROPEXCHANGEENUM pxenum;
  353. pxenum.pEnumerator = pPX->GetEnumerator(_T("menu"));
  354. pxenum.pos = pxenum.pEnumerator->GetPosition(32000);
  355. ::EnumResourceNames(hModule, RT_MENU, &EnumResMenuProc, (LONG_PTR)&pxenum);
  356. delete pxenum.pEnumerator;
  357. }
  358. BOOL CALLBACK EnumResDialogProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)
  359. {
  360. PROPEXCHANGEENUM* pxEnum = (PROPEXCHANGEENUM*)lParam;
  361. ASSERT(pxEnum);
  362. if (!pxEnum)
  363. return FALSE;
  364. HRSRC hRsrc = FindResource(hModule, lpszName, lpszType);
  365. if (!hRsrc)
  366. return FALSE;
  367. HGLOBAL hRsrcData = LoadResource(hModule, hRsrc);
  368. LPBYTE lpszData = (LPBYTE)LockResource(hRsrcData);
  369. CXTPPropExchangeSection sec(pxEnum->pEnumerator->GetNext(pxEnum->pos));
  370. int nResource = (UINT)(UINT_PTR)lpszName;
  371. PX_Int(&sec, _T("id"), nResource);
  372. DLGTEMPLATE* pItem = (DLGTEMPLATE*)lpszData;
  373. PutDialogTemplate(&sec, pItem);
  374. return TRUE;
  375. }
  376. void ConvertDialogs(HMODULE hModule, CXTPPropExchange* pPX)
  377. {
  378. PROPEXCHANGEENUM pxenum;
  379. pxenum.pEnumerator = pPX->GetEnumerator(_T("dialog"));
  380. pxenum.pos = pxenum.pEnumerator->GetPosition(32000);
  381. ::EnumResourceNames(hModule, RT_DIALOG, &EnumResDialogProc, (LONG_PTR)&pxenum);
  382. delete pxenum.pEnumerator;
  383. }
  384. int ConvertFile(CString lpszFileName)
  385. {
  386. HMODULE hModule =  LoadLibrary(lpszFileName);
  387. ASSERT(hModule);
  388. CXTPPropExchangeXMLNode secResources(FALSE, 0, _T("resource"));
  389. if (!secResources.OnBeforeExchange())
  390. return 1;
  391. BOOL bEncoding = FALSE;
  392. RESOURCE_LANGUAGE lan;
  393. WORD wLanguage = CXTPResourceManager::GetResourceLanguage(hModule);
  394. if (wLanguage == 0)
  395. return 1;
  396. if (!FindLanguage(&lan, wLanguage))
  397. return FALSE;
  398. if (!lan.strEncoding.IsEmpty())
  399. {
  400. secResources.SetEncoding(lan.strEncoding);
  401. PX_String(&secResources, _T("Language"), lan.strLangauge);
  402. PX_Long(&secResources, _T("LANGID"), lan.wLanguage);
  403. }
  404. ConvertStrings(hModule, &secResources);
  405. ConvertMenus(hModule, &secResources);
  406. ConvertDialogs(hModule, &secResources);
  407. FreeLibrary(hModule);
  408. CString strOutput = lpszFileName.Left(lpszFileName.GetLength() - 3) + _T("xml");
  409. secResources.SaveToFile(strOutput, TRUE);
  410. return 0;
  411. }
  412. int _tmain(int argc, TCHAR* argv[], TCHAR* /*envp*/ [])
  413. {
  414. USES_CONVERSION;
  415. int nRetCode = 0;
  416. // initialize MFC and print and error on failure
  417. if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  418. {
  419. cerr << "Fatal Error: MFC initialization failed" << endl;
  420. return 1;
  421. }
  422. OleInitialize(0);
  423. if (argc != 2)
  424. {
  425. cerr << "This tool generates xml resources from dll" << endl;
  426. cerr << "Usage: XMLResource translationdir" << endl;
  427. return 1;
  428. }
  429. CString strPath = argv[1];
  430. CFileFind finder;
  431. BOOL bWorking = finder.FindFile(strPath + _T("\*.dll"));
  432. while (bWorking)
  433. {
  434. bWorking = finder.FindNextFile();
  435. CString strPath = finder.GetFilePath();
  436. LPSTR lpszFilePath = T2A((LPTSTR)(LPCTSTR)strPath);
  437. cout << "Converting " << lpszFilePath << "..." << endl;
  438. ConvertFile(finder.GetFilePath());
  439. }
  440. OleUninitialize();
  441. return nRetCode;
  442. }