// // GetVersionString.c // // Retrieve strings from a file's version information // // www.catch22.net // #include #include #pragma comment(lib, "version.lib") // // Get the specified file-version information string from a file // // szItem - version item string, e.g: // "FileDescription", "FileVersion", "InternalName", // "ProductName", "ProductVersion", etc (see MSDN for others) // TCHAR *GetVersionString(TCHAR *szFileName, TCHAR *szValue, TCHAR *szBuffer, ULONG nLength) { DWORD len; PVOID ver; DWORD *codepage; char fmt[0x40]; PVOID ptr = 0; BOOL result = FALSE; szBuffer[0] = '\0'; len = GetFileVersionInfoSize(szFileName, 0); if(len == 0 || (ver = malloc(len)) == 0) return NULL; if(GetFileVersionInfo(szFileName, 0, len, ver)) { if(VerQueryValue(ver, "\\VarFileInfo\\Translation", &codepage, &len)) { wsprintf(fmt, "\\StringFileInfo\\%04x%04x\\%s", (*codepage) & 0xFFFF, (*codepage) >> 16, szValue); if(VerQueryValue(ver, fmt, &ptr, &len)) { lstrcpyn(szBuffer, (TCHAR*)ptr, min(nLength, len)); result = TRUE; } } } free(ver); return result ? szBuffer : NULL; } int main() { TCHAR buf[MAX_PATH]; // Get file description for explorer.exe if(GetVersionString("C:\\windows\\explorer.exe", "FileDescription", buf, MAX_PATH)) printf("%s\n", buf); return 0; }