Làm cách nào để truy xuất khi chạy thông tin phiên bản được lưu trữ trong Windows exe/dll? Thông tin này được đặt theo cách thủ công bằng cách sử dụng tệp tài nguyên.Làm cách nào tôi có thể truy xuất số phiên bản của Windows EXE hoặc DLL?
Trả lời
Đây là một C++ cách để làm việc đó, bằng cách sử dụng các hàm API của Windows tiêu chuẩn:
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...
}
Lưu ý rằng bắt phần hoàn toàn là giáo dục - trong một tình huống thực sự bạn sẽ đúng cách dọn dẹp sau khi cấp phát bộ nhớ và thực sự sử dụng mã lỗi!
Câu trả lời của Valentin là chính xác, nhưng lưu ý cảnh báo của người nhận xét về khả năng rò rỉ bộ nhớ.
Tôi cũng không chắc chắn lý do bạn muốn sử dụng :: HeapAlloc trong ngày và tuổi này.
Đây là một đoạn trích sử dụng mới và tăng :: shared_array để làm điều tương tự trong IMHO là cách an toàn và rõ ràng hơn.
#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....
Dưới đây là một phiên bản 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;
Để kiểm tra lắp ráp NET, trong C#:
System.Reflection.Assembly.LoadFile (@ "c: \ windows \ Microsoft. NET \ Framework \ v2.0.50727 \ system.data.dll "). GetName(). Version.ToString();
- 1. Lấy phiên bản tập tin của một dll hoặc exe
- 2. Tôi làm cách nào để có được số phiên bản của mỗi DLL có plugin MEF của tôi?
- 3. DLL phiên bản lỗi
- 4. Cách truy xuất phiên bản sdk android?
- 5. Tôi có thể sử dụng 32 bit dll hoặc exe trong python 64 bit không?
- 6. vcredist_x86.dll và phiên bản 8.0.50727.4053
- 7. Phiên bản Windows Python và VC++ Phiên bản Redistributable Windows
- 8. Làm cách nào tôi có thể so sánh số phiên bản tùy ý?
- 9. Tôi có thể gỡ lỗi một số Exe
- 10. Công cụ dòng lệnh để đổ phiên bản Windows DLL?
- 11. Phiên bản .NET nào có phiên bản Windows nào?
- 12. Winforms: nhận số Phiên bản xuất bản?
- 13. Tôi cần phiên bản MSVCR90.dll 9.0.21022.8
- 14. Tôi có thể tạo chứng chỉ số của riêng mình trong C# hoặc Windows không?
- 15. Làm thế nào ứng dụng iphone của tôi có thể phát hiện số phiên bản của riêng mình?
- 16. Làm thế nào tôi có thể trích xuất java exe để jar
- 17. Làm thế nào để ẩn các chuỗi trong một exe hoặc một dll?
- 18. Làm thế nào để gọi một hàm được định nghĩa trong exe của tôi bên trong DLL của tôi?
- 19. Cách phát hiện tệp PE đã cho (exe hoặc dll) là 64 bit hoặc 32 bit
- 20. Tôi làm cách nào để kiểm tra phiên bản của phiên bản Liferay?
- 21. Mã dll của tôi hoạt động từ tệp exe, nhưng không tải được từ Java loadLibrary
- 22. ASP.net: Tôi có thể có 2 phiên bản khác nhau của cùng một dll/assembly trong thư mục bin không?
- 23. Làm cách nào tôi có thể truy xuất nhiều đối tượng bằng JPA?
- 24. Tôi làm cách nào để có được thông tin về phiên bản và tiêu đề của ứng dụng Windows Store?
- 25. Tôi làm cách nào để truy cập phiên bản alpha của ứng dụng Android trên Google Play?
- 26. Truy xuất thông tin phiên bản từ các tệp lớn
- 27. Nhận thông tin phiên bản cho .exe
- 28. Android cách xuất bản phiên bản beta của ứng dụng
- 29. C#: cách đặt số phiên bản của assembly
- 30. Làm cách nào để cài đặt phiên bản OpenGL hiện tại cho Windows C++?
Nếu có một cú ném sau khi bạn gọi đến :: HeapAlloc, điều này sẽ làm rò rỉ bộ nhớ. – plinth