¿Cómo recuperar en tiempo de ejecución la información de la versión almacenada en un exe/dll de Windows? Esta información se establece manualmente utilizando un archivo de recursos.¿Cómo puedo recuperar el número de versión de un archivo EXE o DLL de Windows?
Respuesta
Aquí es una forma de C++ de hacerlo, utilizando el estándar de funciones API de Windows:
try
{
TCHAR szFileName[ MAX_PATH ];
if(!::GetModuleFileName(0, szFileName, MAX_PATH))
throw __LINE__;
DWORD nParam;
DWORD nVersionSize = ::GetFileVersionInfoSize(szFileName, &nParam);
if(!nVersionSize)
throw __LINE__;
HANDLE hMem = ::GetProcessHeap();
if(!hMem)
throw __LINE__;
LPVOID lpVersionData = ::HeapAlloc(hMem, 0, nVersionSize);
if(!lpVersionData)
throw __LINE__;
if(!::GetFileVersionInfo(szFileName, 0, nVersionSize, lpVersionData))
throw __LINE__;
LPVOID pVersionInfo;
UINT nSize;
if(!::VerQueryValue(lpVersionData, _T("\\"), &pVersionInfo, &nSize))
throw __LINE__;
VS_FIXEDFILEINFO *pVSInfo = (VS_FIXEDFILEINFO *)pVersionInfo;
CString strVersion;
strVersion.Format(_T(" version %i.%i.%i.%i"),
pVSInfo->dwProductVersionMS >> 16,
pVSInfo->dwProductVersionMS & 0xFFFF,
pVSInfo->dwProductVersionLS >> 16,
pVSInfo->dwProductVersionLS & 0xFFFF
);
GetDlgItem(IDC_ABOUT_VERSION)->SetWindowText(strAppName + strVersion);
if(!HeapFree(hMem, 0, lpVersionData))
throw __LINE__;
}
catch(int err)
{
ASSERT(!err); // always break on debug builds to inspect error codes and such
DWORD dwErr = ::GetLastError();
// handle memory cleanup...
}
Tenga en cuenta que la captura parte es puramente educativa - en una situación real que lo haría adecuadamente la limpieza después de la asignación de memoria y de hecho usa el código de error!
La respuesta de Valentin es correcta, pero tenga en cuenta la advertencia del plinth del comentarista sobre la posibilidad de una pérdida de memoria.
Tampoco estoy seguro de por qué usaría :: HeapAlloc hoy en día.
Aquí hay un fragmento que usa new y boost :: shared_array para hacer lo mismo en lo que en mi humilde opinión es una manera más segura y más limpia.
#include <boost/shared_array.hpp>
//.....
DWORD dwHandle;
DWORD dwFileVersionInfoSize = GetFileVersionInfoSize((LPTSTR)lpszFileName, &dwHandle);
if (!dwFileVersionInfoSize)
return FALSE;
// ensure our data will be deleted
boost::shared_array<BYTE> data(new BYTE[dwFileVersionInfoSize]);
LPVOID const lpData = data.get();
//party on with lpData....
Aquí hay una versión de Delphi 7:
uses Windows, SysUtils;
function GetEXEVersion(exename: string; const Fmt : string = '%d.%d.%d.%d'): string;
{
credit to [email protected]
(http://martinstoeckli.ch/delphi/delphi.html#AppVersion)
}
var
iBufferSize, iDummy : dword;
pBuffer, pFileInfo : Pointer;
iVer : array[1..4] of word;
begin
Result := '';
iBufferSize := GetFileVersionInfoSize(PChar(exename), iDummy);
if iBufferSize > 0 then begin
GetMem(pBuffer, iBufferSize);
try
GetFileVersionInfo(PChar(exename), 0, iBufferSize, pBuffer);
VerQueryValue(pBuffer, '\', pFileInfo, iDummy);
iVer[1] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS);
iVer[2] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS);
iVer[3] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS);
iVer[4] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS);
finally FreeMem(pBuffer);
end;
Result := Format(Fmt, [iVer[1],iVer[2],iVer[3],iVer[4]]);
end;
end;
Para comprobar ensamblados .NET, en C#:
System.Reflection.Assembly.LoadFile (@ "c: \ windows \ Microsoft. NET \ Framework \ v2.0.50727 \ system.data.dll "). GetName(). Version.ToString();
- 1. Obtener la versión de archivo de un dll o exe
- 2. número de versión de un archivo DLL en .NET
- 3. Cómo descompilar un exe o un dll en el ensamblado
- 4. .net: ¿Números de versión para DLL frente a EXE?
- 5. ¿Cómo se puede combinar un archivo DLL de Windows C++ en un exe de aplicación C#?
- 6. Firmando un archivo EXE de Windows
- 7. Analizar archivos .exe/.dll (Windows PE) para código de inflado
- 8. Archivo DLL versión
- 9. Compilación de un código IronPython a EXE o DLL
- 10. ¿Puede un archivo DLL de Windows recuperar su propio nombre de archivo?
- 11. Recuperar el número total de líneas en un archivo
- 12. ¿Cómo saber si un archivo es un EXE o un DLL?
- 13. ¿Cómo sincronizar la revisión SVN y los recursos de versión de los archivos EXE/DLL?
- 14. ¿Cómo puedo cambiar el parámetro de idioma de un archivo exe generado por launch4j?
- 15. ¿Cómo puedo recuperar el archivo fuente de un método compilado?
- 16. ¿Puedo usar 32bit dll o exe en 64bit python?
- 17. EXE o DLL Dirección base de la imagen
- 18. ¿Cómo puedo averiguar qué bibliotecas usa un exe de Windows?
- 19. ¿Cómo recupero la versión de un archivo de un archivo por lotes en Windows Vista?
- 20. ¿Cómo puedo recuperar el número de filas eliminadas con PDO?
- 21. ¿Cómo puedo convertir un archivo JAR en un archivo EXE?
- 22. Consulte el número de versión o número de versión en el código
- 23. Integrado a * .exe en un dll
- 24. C++: Carga de un archivo EXE como un archivo DLL, vftable problema local de
- 25. Al compilar un archivo DLL, ¿el archivo LIB generado contiene el nombre de la DLL?
- 26. ofuscación de .NET exe/dll
- 27. Escribiendo C# GUI sobre un C++ dll o C++ exe
- 28. ¿Cómo puedo seleccionar el nombre de archivo con el número de versión más alto?
- 29. ¿Cómo puedo hacer referencia a un archivo DLL independientemente de la versión?
- 30. C#: cómo establecer el número de versión del ensamblaje
Si hay un lanzamiento después de su llamada a :: HeapAlloc, esto perderá memoria. – plinth