válida una standard signatura seguro referencia puede para nombre net necesita hacer este error ensamblado con como cargar axinterop archivo acropdflib c++ winapi dll version exe

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; }



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);



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; }