如何在運行時檢索存儲在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. 如何通過cmake將版本信息添加到.exe或.dll
- 4. 使用腳本檢測DLL版本號
- 5. .net:DLL與EXE的版本號?
- 6. cmd,找到.exe版本號
- 7. Windows CE .EXE符號訪問來自DLL
- 8. 從inno setup獲取exe或dll的版本
- 9. 如何檢查版本號?
- 10. EXE版本號 - 如何正確比較次要版本
- 11. Asp.net網站DLL版本號
- 12. DLL EXE混合C++的Windows
- 13. 得到一個DLL或EXE
- 14. 如何確定使用vb.net或c#的Windows內部版本號?
- 15. 如何將版本號和版權嵌入到我的DLL中?
- 16. exe文件的Visual Studio 2013版本號?
- 17. Apache:Tomcat「任何版本」.exe或.zip
- 18. 如何檢測Windows的語言版本
- 19. 如何檢查Windows上的OpenMP版本
- 20. Groovy檢索文件版本屬性(Windows)
- 21. 如何檢索二進制文件的二進制版本號
- 22. 如何以編程方式檢索庫的版本號?
- 23. 檢索版本號在VS與QMAKE
- 24. 如何從.NET獲取Windows版本號?
- 25. 在Windows 7中擴展的dll版本號
- 26. Py2exe的版本號爲com dll
- 27. 如何讀取ZIP檔案中的.exe版本號?
- 28. 批處理文件: - 檢測Windows版本和運行exe文件
- 29. 如何在Java中檢查Windows版本?
- 30. 如何檢測牆紙改變時(Windows XP或更高版本)?
如果您在調用:: HeapAlloc後出現拋出,將會泄漏內存。 – plinth 2009-03-03 15:26:47