file_info.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <windows.h>
  2. #include "file_info.h"
  3. bool FileInfoUtils::QueryValue(const std::wstring wsValueName, const std::wstring wsModuleName, std::wstring &wsRetStr)
  4. {
  5. bool bSuccess = FALSE;
  6. BYTE *lpVersionData = NULL;
  7. DWORD dwLangCharset = 0;
  8. TCHAR *pStr = NULL;
  9. do {
  10. if (wsValueName.empty() || wsModuleName.empty())
  11. break;
  12. DWORD dwHandle;
  13. DWORD dwDataSize = ::GetFileVersionInfoSize((LPCWSTR)wsModuleName.c_str(), &dwHandle);
  14. if (dwDataSize == 0)
  15. break;
  16. lpVersionData = new (std::nothrow) BYTE[dwDataSize];
  17. if (NULL == lpVersionData)
  18. break;
  19. if (!::GetFileVersionInfo((LPCWSTR)wsModuleName.c_str(), dwHandle, dwDataSize, (void *)lpVersionData))
  20. break;
  21. UINT nQuerySize;
  22. DWORD *pTransTable;
  23. if (!::VerQueryValue(lpVersionData, L"\\VarFileInfo\\Translation", (void **)&pTransTable, &nQuerySize))
  24. break;
  25. dwLangCharset = MAKELONG(HIWORD(pTransTable[0]), LOWORD(pTransTable[0]));
  26. if (lpVersionData == NULL)
  27. break;
  28. pStr = new (std::nothrow) TCHAR[128];
  29. if (NULL == pStr)
  30. break;
  31. // wchar_t str2[MAX_PATH];
  32. // wcscpy_s(str2, MAX_PATH, wsValueName.c_str());
  33. swprintf_s(pStr, 128, L"\\StringFileInfo\\%08lx\\%s", dwLangCharset, wsValueName.c_str());
  34. LPVOID lpData;
  35. // GetFileVersionInfoSize, GetFileVersionInfo
  36. if (::VerQueryValue((void *)lpVersionData, pStr, &lpData, &nQuerySize))
  37. wsRetStr = (TCHAR *)lpData;
  38. bSuccess = TRUE;
  39. } while (FALSE);
  40. if (lpVersionData) {
  41. delete[] lpVersionData;
  42. lpVersionData = NULL;
  43. }
  44. if (pStr) {
  45. delete[] pStr;
  46. pStr = NULL;
  47. }
  48. return bSuccess;
  49. }