c++ - una - ¿Cómo obtengo la versión de un archivo DLL o EXE?
no se puede cargar el archivo o ensamblado restsharp (7)
Necesito obtener la versión del producto y la versión de archivo para un archivo DLL o EXE utilizando las API nativas de Win32 en C o C ++. No estoy buscando la versión de Windows, sino los números de versión que ve haciendo clic con el botón derecho en un archivo DLL, seleccionando "Propiedades" y luego mirando la pestaña "Detalles". Suele ser un número de versión de cuatro partes xxxx
Dado que ninguna de las respuestas lo menciona ... descubrí que debe hacer diferentes cálculos dependiendo de si se está ejecutando en sistemas de 32 o 64 bits . Es por eso que encuentras que ciertas respuestas en esta pregunta funcionan para ti, y otras no.
Aquí hay una implementación de ejemplo que uso:
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);
}
Y la implementación de IsWow64 (no la mía):
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;
}
Encontré estos artículos ... lo siento, pero no tengo experiencia directa sobre cómo hacer esto usando API nativas, así que me detuve a una búsqueda en Internet:
- C ++: determinación del número de versión de un archivo DLL o ejecutable
- VB (probablemente la versión 6): Cómo usar las funciones en VERSION.DLL
Espero que esto ayude!
Este código muestra los números de versión del archivo correctamente.
( pFileInfo->dwFileVersionMS >> 16 ) & 0xff,
( pFileInfo->dwFileVersionMS >> 0 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 16 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 0 ) & 0xff);
La forma más fácil es usar las funciones de la API GetFileVersionInfoEx o GetFileVersionInfo() .
También puede hacerlo desde sus recursos de aplicación como se explica here .
Obtiene esta información utilizando las API de información de versión . Aquí hay una muestra:
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
);
}
Todas estas soluciones no funcionaron correctamente (con mi sistema). Descubrí que cada una de las cuatro partes del número de versión se guarda como un valor de 16 bits.
Los dos primeros números se guardan en DWORD dwFileVersionMS de 32 bits y los dos segundos en dwFileVersionLS. Así que edité tu código en la sección de salida de esta manera:
TRACE( "File Version: %d.%d.%d.%d/n",
( pFileInfo->dwFileVersionMS >> 16 ) & 0xffff,
( pFileInfo->dwFileVersionMS >> 0 ) & 0xffff,
( pFileInfo->dwFileVersionLS >> 16 ) & 0xffff,
( pFileInfo->dwFileVersionLS >> 0 ) & 0xffff
);
Y funciona perfectamente. La salida está formateada como en mi sistema:
major.minor.build.revision
Utilizaría la API GetFileVersionInfo .
Consulte Uso de la información de la versión en el sitio de MSDN.
Muestra:
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;
}