-
翻阅古今
您将使用GetFileVersionInfo API。请参阅MSDN站点上的使用版本信息。样品:DWORD verHandle = 0;UINT size = 0;LPBYTE lpBuffer = NULL;DWORD verSize = GetFileVersionInfoSize( szVersionFile, &verHandle);if (verSize != NULL){ LPSTR verData = new char[verSize]; if (GetFileVersionInfo( szVersionFile, verHandle, verSize, verData)) { if (VerQueryValue(verData,"\\",(VOID FAR* FAR*)&lpBuffer,&size)) { if (size) { VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer; if (verInfo->dwSignature == 0xfeef04bd) { // Doesn't matter if you are on 32 bit or 64 bit, // DWORD is always 32 bits, so first two revision numbers // come from dwFileVersionMS, last two come from dwFileVersionLS TRACE( "File Version: %d.%d.%d.%d\n", ( verInfo->dwFileVersionMS >> 16 ) & 0xffff, ( verInfo->dwFileVersionMS >> 0 ) & 0xffff, ( verInfo->dwFileVersionLS >> 16 ) & 0xffff, ( verInfo->dwFileVersionLS >> 0 ) & 0xffff ); } } } } delete[] verData;}
-
呼啦一阵风
所有这些解决方案均无法正常运行(在我的系统上)。我发现版本号的四个部分中的每个部分都保存为16位值。前两个数字保存在32位DWORD dwFileVersionMS中,后两个数字保存在dwFileVersionLS中。因此,我在输出部分编辑了您的代码,如下所示: TRACE( "File Version: %d.%d.%d.%d\n", ( pFileInfo->dwFileVersionMS >> 16 ) & 0xffff, ( pFileInfo->dwFileVersionMS >> 0 ) & 0xffff, ( pFileInfo->dwFileVersionLS >> 16 ) & 0xffff, ( pFileInfo->dwFileVersionLS >> 0 ) & 0xffff );而且效果很好。输出的格式类似于我的系统:主要,次要,修订版本
-
牛魔王的故事
您可以使用版本信息API获得此信息。这是一个示例:void PrintFileVersion( TCHAR *pszFilePath ){ DWORD dwSize = 0; BYTE *pbVersionInfo = NULL; VS_FIXEDFILEINFO *pFileInfo = NULL; UINT puLenFileInfo = 0; // Get the version information for the file requested dwSize = GetFileVersionInfoSize( pszFilePath, NULL ); if ( dwSize == 0 ) { printf( "Error in GetFileVersionInfoSize: %d\n", GetLastError() ); return; } pbVersionInfo = new BYTE[ dwSize ]; if ( !GetFileVersionInfo( pszFilePath, 0, dwSize, pbVersionInfo ) ) { printf( "Error in GetFileVersionInfo: %d\n", GetLastError() ); delete[] pbVersionInfo; return; } if ( !VerQueryValue( pbVersionInfo, TEXT("\\"), (LPVOID*) &pFileInfo, &puLenFileInfo ) ) { printf( "Error in VerQueryValue: %d\n", GetLastError() ); delete[] pbVersionInfo; return; } // pFileInfo->dwFileVersionMS is usually zero. However, you should check // this if your version numbers seem to be wrong printf( "File Version: %d.%d.%d.%d\n", ( pFileInfo->dwFileVersionLS >> 24 ) & 0xff, ( pFileInfo->dwFileVersionLS >> 16 ) & 0xff, ( pFileInfo->dwFileVersionLS >> 8 ) & 0xff, ( pFileInfo->dwFileVersionLS >> 0 ) & 0xff ); // pFileInfo->dwProductVersionMS is usually zero. However, you should check // this if your version numbers seem to be wrong. printf( "Product Version: %d.%d.%d.%d\n", ( pFileInfo->dwProductVersionLS >> 24 ) & 0xff, ( pFileInfo->dwProductVersionLS >> 16 ) & 0xff, ( pFileInfo->dwProductVersionLS >> 8 ) & 0xff, ( pFileInfo->dwProductVersionLS >> 0 ) & 0xff );}