Wie erhalte ich programmatisch die Version einer DLL oder EXE-Datei?
Frage
Ich brauche die Produktversion und Dateiversion für eine DLL oder EXE-Datei mit Win32 nativen APIs in C oder C ++ zu erhalten. Ich bin nicht der Suche nach der Windows-Version, aber die Versionsnummern, die Sie mit der rechten Maustaste auf eine DLL-Datei, wählen Sie „Eigenschaften“, dann auf der Registerkarte „Details“ suchen. Dies ist in der Regel eine vierteilige gepunktete Versionsnummer x.x.x.x.
Lösung
Sie würden verwenden, um die GetFileVersionInfo API.
Siehe Mit Versionsinformationen auf der MSDN Website.
Beispiel:
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;
}
Andere Tipps
All diese Lösungen funktionierten nicht richtig (mit meinem System). Ich fand heraus, dass jeder der vier Teile der Versionsnummer wird als 16-Bit-Wert gespeichert.
Die ersten beiden Zahlen sind in dem 32-Bit-DWORD dwFileVersionMS gespeichert und die zweiten zwei in dwFileVersionLS. So bearbeitete ich den Code an den Ausgabeabschnitt wie folgt aus:
TRACE( "File Version: %d.%d.%d.%d\n",
( pFileInfo->dwFileVersionMS >> 16 ) & 0xffff,
( pFileInfo->dwFileVersionMS >> 0 ) & 0xffff,
( pFileInfo->dwFileVersionLS >> 16 ) & 0xffff,
( pFileInfo->dwFileVersionLS >> 0 ) & 0xffff
);
Und es funktioniert perfekt. Der Ausgang ist so formatiert, wie auf meinem System:
major.minor.build.revision
Sie diese Informationen erhalten, indem die Versionsinformationen APIs . Hier ist ein Beispiel:
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
);
}
Dieser Code zeigt die Dateiversionsnummern korrekt.
( pFileInfo->dwFileVersionMS >> 16 ) & 0xff,
( pFileInfo->dwFileVersionMS >> 0 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 16 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 0 ) & 0xff);
diese Artikel gefunden ... sorry, aber ich habe keine direkte Erfahrung mit, wie diese mit nativen APIs zu tun, so dass ich zu einer Internet-Suche latenter:
- C ++: die Version Bestimmung Nummer einer DLL oder Executable
- VB (wahrscheinlich Version 6): verwenden So verwenden Funktionen in Version.dll
Hoffe, dass diese Hilfe!
Der einfachste Weg ist die GetFileVersionInfoEx oder GetFileVersionInfo API-Funktionen.
Sie können es auch tun, aus Ihrer Anwendung Ressourcen wie erläutert hier .
Da keine der Antworten, die es erwähnen ... Ich fand heraus, dass Sie verschiedene Berechnungen durchführen müssen, je nachdem ob Sie laufen auf 32- oder 64-Bit-Systemen . Deshalb sollten Sie, dass bestimmte Antworten auf diese Frage für Sie arbeiten finden, und andere nicht.
Hier ist eine Beispielimplementierung ich benutze:
if(IsWow64())
{
// 64 bit build
major = (verInfo->dwProductVersionMS >> 16) & 0xffff;
minor = (verInfo->dwProductVersionMS >> 0) & 0xffff;
revision = (verInfo->dwProductVersionLS >> 16) & 0xffff;
build = (verInfo->dwProductVersionLS >> 0) & 0xffff;
}
else
{
// 32 bit build
major = HIWORD(verInfo->dwProductVersionMS);
minor = LOWORD(verInfo->dwProductVersionMS);
revision = HIWORD(verInfo->dwProductVersionLS);
build = LOWORD(verInfo->dwProductVersionLS);
}
Und die Umsetzung von IsWow64 (nicht von mir):
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
//IsWow64Process is not available on all supported versions of Windows.
//Use GetModuleHandle to get a handle to the DLL that contains the function
//and GetProcAddress to get a pointer to the function if available.
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if(NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// Handle error...
}
}
return bIsWow64;
}