如何在運行時檢索存儲在Windows EXE/DLL中的版本信息?此信息是使用資源文件手動設置的。如何檢索Windows EXE或DLL的版本號?
5
A
回答
6
這裏是幹什麼的,使用標準的Windows API函數的C++方式:
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...
}
注意,抓部分是純粹的教育 - 在真實的情況下,你會在內存分配後妥善清理並實際使用錯誤代碼!
2
Valentin的回答是正確的,但請注意評論者對可能發生內存泄漏的警告。
我也不確定你爲什麼要在這個時代使用:: HeapAlloc。
這裏是一個片段,它使用new和boost :: shared_array在IMHO中做同樣的事情是一種更安全和更清潔的方式。
#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....
2
這裏是一個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;
1
要檢查.NET程序集,在C#:
System.Reflection.Assembly.LoadFile(@「C:\ WINDOWS \微軟。 NET \框架\ V2.0.50727 \ system.data.dll中「)的GetName()Version.ToString()。
相關問題
- 1. 如何從命令行更改EXE或DLL版本號?
- 2. 如何更改Microsoft Visual C++ EXE或DLL的文件版本?
- 3. 使用腳本檢測DLL版本號
- 4. cmd,找到.exe版本號
- 5. Asp.net網站DLL版本號
- 6. DLL EXE混合C++的Windows
- 7. 如何確定使用vb.net或c#的Windows內部版本號?
- 8. 如何將版本號和版權嵌入到我的DLL中?
- 9. Apache:Tomcat「任何版本」.exe或.zip
- 10. 如何檢測Windows的語言版本
- 11. 檢索版本號在VS與QMAKE
- 12. 如何檢索二進制文件的二進制版本號
- 13. 如何從.NET獲取Windows版本號?
- 14. Py2exe的版本號爲com dll
- 15. 批處理文件: - 檢測Windows版本和運行exe文件
- 16. 如何在Java中檢查Windows版本?
- 17. 如何檢測牆紙改變時(Windows XP或更高版本)?
- 18. 如何檢查版本號大於或小於
- 19. 檢索MSbuild中的多個DLL的彙編版本信息
- 20. C++版本,他們會自動檢測exe的版本嗎?
- 21. 如何檢查exe的版本兼容性
- 22. Windows Installer使用組件版本或文件版本來更新dll
- 23. 如何檢索android sdk版本?
- 24. 參考代碼中的內部版本號或版本號
- 25. 創建一個沒有版本號的.net DLL版本
- 26. Windows mobile,更改版本號
- 27. Windows如何處理加載DLL的兩個不同版本?
- 28. 如何讀取MSBuild中的DLL版本號?
- 29. 良好的做法,使.exe和.dll具有相同的版本?
- 30. 找到構建exe/dll的視覺工作室版本(C#)
如果您在調用:: HeapAlloc後出現拋出,將會泄漏內存。 – plinth 2009-03-03 15:26:47