Wie zur Laufzeit die Versionsinformationen abgerufen in einer Windows-Exe/DLL? Diese Information wird manuell mithilfe einer Ressourcendatei festgelegt.Wie kann ich die Versionsnummer einer Windows EXE oder DLL abrufen?
Antwort
Hier ist eine C++ Art und Weise tun, die Standard-Windows-API-Funktionen:
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...
}
Beachten Sie, dass der Fang Teil rein Bildungs ist - in einer realen Situation würden Sie richtig Bereinigung nach der Speicherzuweisung und benutze den Fehlercode!
Valentins Antwort ist korrekt, aber beachten Sie die Warnung des Kommentators vor der Möglichkeit eines Speicherlecks.
Ich bin auch nicht sicher, warum Sie :: HeapAlloc in der heutigen Zeit verwenden würde.
ist hier ein Snippet, die neuen verwendet und boost :: shared_array, das Gleiche zu tun, in welchem IMHO ein sicherer und sauberer Weg.
#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....
Hier ist eine Delphi-7-Version:
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;
.NET-Assemblies zu überprüfen, in C#:
System.Reflection.Assembly.LoadFile (@ "c: \ windows \ Microsoft. NET \ Framework \ v2.0.50727 \ system.data.dll "). GetName(). Version.ToString();
- 1. Wie ändere ich eine EXE- oder DLL-Versionsnummer über die Befehlszeile?
- 2. Versionsnummer einer DLL in .NET
- 3. So ändern Sie die Spracheigenschaft einer dll/exe unter Windows
- 4. Programmgesteuert erhalten Sie die Versionsnummer einer DLL
- 5. Wie kann ich die digitale Signatur einer .exe oder .dll in Perl überprüfen?
- 6. Wie kann ich die Windows-Versionsnummer von .NET bekommen?
- 7. Batch-Set-Versionsnummer für EXE-und DLL-Dateien
- 8. Wie ändere ich die Dateiversion einer Microsoft Visual C++ EXE oder DLL?
- 9. Kann ich 32bit dll oder exe in 64bit python verwenden?
- 10. Kann eine Windows-DLL ihren eigenen Dateinamen abrufen?
- 11. Kann ich dll in exe (in Visual Studio) einschließen?
- 12. Abrufen der Größe des Codesegments einer DLL oder EXE beim Laden in den Speicher
- 13. Wie kann ich die Ausführungsversionsinformationen in einer Windows Store App abrufen?
- 14. Wie kann ich die Version einer Assembly in C# abrufen?
- 15. DLL-Datei oder .exe-Datei fehlt
- 16. Wie kann ich die Build-Versionsnummer mit der Versionsnummer der ausführbaren Datei synchronisieren?
- 17. Wie kann ich auf eine laufende Instanz einer eigenständigen .NET-Datei von einer .NET Dll oder Exe zugreifen?
- 18. Wie bekomme ich die IE-Versionsnummer aus der Windows-Registrierung?
- 19. Wie kann ich die SID des aktuellen Windows-Kontos abrufen?
- 20. Aufrufen einer EXE mit Bezug auf die C# Windows-Anwendung
- 21. Wie bekomme ich die Versionsnummer jeder DLL, die meine MEF-Plugins hat?
- 22. Kompilieren eines IronPython-Codes zu EXE oder DLL
- 23. Wie aktualisiere ich die Versionsnummer der DLL, die vom VS2005-Webimplementierungsprojekt mit NAnt generiert wurde
- 24. Wie Debuggen einer Windows DLL, die in Python verwendet wird?
- 25. Wie bekomme ich die Versionsnummer von JavaFX?
- 26. Wie bekomme ich die F # Versionsnummer?
- 27. Verschleierung von .NET exe/dll
- 28. Wie bekomme ich die Versionsnummer von einer statischen Bibliothek?
- 29. wie exe funktioniert und wie der Aufruf für dll und exe Dateiadressierung erfolgt
- 30. Wie kann ich die Versionsnummer des Gedankenstrichs ermitteln?
Wenn nach dem Aufruf von :: HeapAlloc ein throw auftritt, wird dadurch Speicher gelöscht. – plinth