Newsgroup: it.comp.lang.visual-basic
Titolo: Ottenere la versione di una DLL a runtime

 
          Salve,
avrei bisogno di sapere come ottenere la versione di una DLL del PC: io
passo alla funzione, chiamamola VersioneDLL, solamente il nome della DLL (ad
es. pippo.DLL) e la va a cercare nei posti dove si "dovrebbero" trovare le
dll (C:\IWNDOWS\SYSTEM, C:\IWNDOWS\SYSTEM32, dir dell'applicazione in
esecuzione, etc).
Come si fa?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 esecuzione, etc).
...googlando un po' la soluzione si trova. Ad ogni modo ecco la soluzione...
Per ricavare la versione di un file (DLL, EXE, ...): chiamare la
funzione GetFileVersion riportata nel seguito: se c'è un errore durante
la verifica ritorna la descrizione di cosa è andato storto, altrimenti
ritorna una stringa vuota ("") e popola la variabile Versione passata in
ingresso. Per sapere la cartella di sistema dove sono installate le DLL
basta cercare l'API GetSystemDirectory. Da notare che la DLL usata da un
programma potrebbe essere posizionata anche nella cartella del programma
stesso.
Private Type VS_FIXEDFILEINFO
   dwSignature As Long
   dwStrucVersionl As Integer
   dwStrucVersionh As Integer
   dwFileVersionMSl As Integer
   dwFileVersionMSh As Integer
   dwFileVersionLSl As Integer
   dwFileVersionLSh As Integer
   dwProductVersionMSl As Integer
   dwProductVersionMSh As Integer
   dwProductVersionLSl As Integer
   dwProductVersionLSh As Integer
   dwFileFlagsMask As Long
   dwFileFlags As Long
   dwFileOS As Long
   dwFileType As Long
   dwFileSubtype As Long
   dwFileDateMS As Long
   dwFileDateLS As Long
End Type
Public Type t_Version
   vMai1 As Long
   vMai2 As Long
   vMin1 As Long
   vMin2 As Long
End Type
Private Declare Function GetFileVersionInfoSize Lib "Version.dll" _
   Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, _
   lpdwHandle As Long) As Long
Private Declare Function GetFileVersionInfo Lib "Version.dll" _
   Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, _
   ByVal dwhandle As Long, ByVal dwlen As Long, lpData As Any) As Long
Private Declare Function VerQueryValue Lib "Version.dll" _
   Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, _
   lplpBuffer As Any, puLen As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (dest As Any, Source As Any, ByVal length As Long)
Public Function GetFileVersion(ByVal FileName As String, _
   Versione As t_Version) As String
   Dim nBuffer As Long, bBuffer() As Byte, n As Long
   Dim pVers As Long, nVers As Long, ffi As VS_FIXEDFILEINFO
   With Versione
      .vMai1 = 0&
      .vMai2 = 0&
      .vMin1 = 0&
      .vMin2 = 0&
   End With
   'Manca la verifica circa l'esistenza del file FileName
   nBuffer = GetFileVersionInfoSize(FileName, n)
   If nBuffer < 1& Then
      GetFileVersion = "Il file " & FileName & _
         " non contiene informazioni sulla versione"
   Else
      ReDim bBuffer(1 To nBuffer)
      If 0& = GetFileVersionInfo(FileName, 0&, nBuffer, bBuffer(1)) Then
         GetFileVersion = "Errore durante la determinazione " & _
            "delle informazioni sul file " & FileName
      Else
          If 0& = VerQueryValue(bBuffer(1), "\", pVers, nVers) Then
            GetFileVersion = "Errore durante l'intorrogazione " & _
               "delle informazioni sul file " & FileName
         ElseIf nVers = 0& Then
            GetFileVersion = "Errore durante l'intorrogazione " & _
               "delle informazioni sul file " & FileName
         Else
            nBuffer = LenB(ffi)
            If nBuffer > nVers Then nBuffer = nVers
            MoveMemory ffi, ByVal pVers, nBuffer
            Versione.vMai1 = ffi.dwFileVersionMSh
            Versione.vMai2 = ffi.dwFileVersionMSl
            Versione.vMin1 = ffi.dwFileVersionLSh
            Versione.vMin2 = ffi.dwFileVersionLSl
         End If
      End If
   End If
End Function

 ha
scritto:

