我在C 项目的资源中有一个版本资源,其中包含版本号,版权和构建详细信息。有一种简单的方法可以在运行时访问它,以填充我的“帮助/关于”对话框,因为我当前正在维护此信息的单独的const值。理想情况下,该解决方案应适用于Windows / CE移动版和Visual C 的早期版本(6.0或更高版本)。
这是我原始答案的编辑版本。
bool GetProductAndVersion(CStringA & strProductName, CStringA & strProductVersion) { // get the filename of the executable containing the version resource TCHAR szFilename[MAX_PATH + 1] = {0}; if (GetModuleFileName(NULL, szFilename, MAX_PATH) == 0) { TRACE("GetModuleFileName failed with error %d\n", GetLastError()); return false; } // allocate a block of memory for the version info DWORD dummy; DWORD dwSize = GetFileVersionInfoSize(szFilename, &dummy); if (dwSize == 0) { TRACE("GetFileVersionInfoSize failed with error %d\n", GetLastError()); return false; } std::vector<BYTE> data(dwSize); // load the version info if (!GetFileVersionInfo(szFilename, NULL, dwSize, &data[0])) { TRACE("GetFileVersionInfo failed with error %d\n", GetLastError()); return false; } // get the name and version strings LPVOID pvProductName = NULL; unsigned int iProductNameLen = 0; LPVOID pvProductVersion = NULL; unsigned int iProductVersionLen = 0; // replace "040904e4" with the language ID of your resources if (!VerQueryValue(&data[0], _T("\\StringFileInfo\\040904e4\\ProductName"), &pvProductName, &iProductNameLen) || !VerQueryValue(&data[0], _T("\\StringFileInfo\\040904e4\\ProductVersion"), &pvProductVersion, &iProductVersionLen)) { TRACE("Can't obtain ProductName and ProductVersion from resources\n"); return false; } strProductName.SetString((LPCSTR)pvProductName, iProductNameLen); strProductVersion.SetString((LPCSTR)pvProductVersion, iProductVersionLen); return true; }