2009-03-03 8 views
5

विंडोज एक्सई/डीएल में संग्रहीत संस्करण जानकारी रनटाइम पर कैसे पुनर्प्राप्त करें? यह जानकारी संसाधन फ़ाइल का उपयोग कर मैन्युअल रूप से सेट है।मैं विंडोज एक्सई या डीएलएल के संस्करण संख्या को कैसे प्राप्त कर सकता हूं?

उत्तर

6

यहाँ एक सी ++ यह कर, मानक Windows API कार्यों का उपयोग करने का तरीका है:

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... 
} 

ध्यान दें कि पकड़ हिस्सा विशुद्ध रूप से शैक्षिक है - एक असली स्थिति में क्या तुम करोगी ठीक से स्मृति आवंटन के बाद सफाई और वास्तव में त्रुटि कोड का उपयोग करें!

+0

यदि आपके कॉल के बाद फेंक दिया गया है :: हेपअलोक, यह स्मृति को रिसाव करेगा। – plinth

2

वैलेंटाइन का जवाब सही है, लेकिन एक स्मृति रिसाव की संभावना के बारे में टिप्पणीकार प्लिंथ की चेतावनी नोट करें।

मुझे यह भी यकीन नहीं है कि आप इस दिन और उम्र में हेपअलोक का उपयोग क्यों करेंगे।

यहां एक स्निपेट है जो आईएमएचओ एक सुरक्षित और क्लीनर तरीका है, वही काम करने के लिए नया और boost :: shared_array का उपयोग करता है। @ "ग

System.Reflection.Assembly.LoadFile (:: \ windows \ माइक्रोसॉफ्ट

#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

यहाँ एक डेल्फी 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 विधानसभाओं जांच करने के लिए सी # में,। नेट \ Framework \ v2.0.50727 \ system.data.dll ") getName() Version.ToString()।।

संबंधित मुद्दे

 संबंधित मुद्दे