Comment récupérer à l'exécution les informations de version stockées dans une exe/dll Windows? Cette information est définie manuellement à l'aide d'un fichier de ressources.Comment puis-je récupérer le numéro de version d'un EXE Windows ou d'une DLL?
Répondre
Voici une C++ façon de le faire, en utilisant les fonctions API Windows standard:
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...
}
Notez que la prise partie est purement éducatif - dans une situation réelle, vous feriez bien le nettoyage après l'allocation de mémoire et utilise réellement le code d'erreur!
La réponse de Valentin est correcte, mais notez l'avertissement de commenter plinth à propos de la possibilité d'une fuite de mémoire.
Je ne sais pas non plus pourquoi vous utiliseriez :: HeapAlloc de nos jours.
Voici un extrait qui utilise new et boost :: shared_array pour faire la même chose dans ce que IMHO est un moyen plus sûr et plus propre.
#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....
est ici une version 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;
Pour vérifier les assemblages .NET, en C#:
System.Reflection.Assembly.LoadFile (@ "c: \ windows \ Microsoft. NET \ Framework \ v2.0.50727 \ system.data.dll "). GetName(). Version.ToString();
- 1. Récupérer le numéro de téléphone Windows Mobile
- 2. Numéro de version d'une dll dans .NET
- 3. Comment puis-je modifier la version du fichier d'un EXE ou d'une DLL Microsoft Visual C++?
- 4. Est-il sûr de réécrire un manifeste EXE ou DLL pour forcer une version particulière des DLL CRT MSVC?
- 5. Comment lire la version du fichier .exe windows?
- 6. Exécuter le code natif via JNI/DLL ou EXE?
- 7. Inclure automatiquement le numéro de version DLL dans le nom de fichier dans Visual Studio
- 8. Attacher le numéro de version à NSKeyedArchive
- 9. Est-il possible d'utiliser Java webstart exécuter .exe ou dll?
- 10. app_themes fichiers css et numéro de version
- 11. Application.UserAppDataRegistry et numéro de version
- 12. vcredist_x86.dll et la version 8.0.50727.4053
- 13. Est-ce que Windows Installer utilise la version d'assemblage ou la version de fichier pour mettre à jour les DLL?
- 14. Numéro de version dans l'application .NET Compact Framework
- 15. Détection d'un numéro de version de DLL à l'aide d'un script
- 16. Version de Visual Studio Setup exe différente de la version de propriétés
- 17. Windows NT version
- 18. Comment savoir si le fichier .exe chargé par ma DLL est sur le point de sortir?
- 19. Identifiez si un fichier (dll/exe) est verrouillé ou non par un processus ou une bibliothèque
- 20. Menu Fusionner les références (.dll et .exe)
- 21. Comment puis-je récupérer la version d'un assembly en C#?
- 22. Une DLL Windows peut-elle récupérer son propre nom de fichier?
- 23. À partir .exe à partir de Visual C++ 2005 dll
- 24. Récupération du numéro de version d'un fichier source dans ClearCase
- 25. DLL de site Web ASP.NET: version de débogage et version
- 26. Comment utiliser les mathématiques Javascript sur un numéro de version
- 27. Signature d'un fichier Windows EXE
- 28. Les noms d'assembly .NET doivent-ils inclure un numéro de version?
- 29. Flash AS3 avec numéro de version HG?
- 30. Comment puis-je intégrer une version dans une DLL?
S'il y a un lancement après votre appel à :: HeapAlloc, cela causera une fuite de mémoire. – plinth