PDA

Vollständige Version anzeigen : Dateiversion einer DLL auslesen


ogl
06.11.2001, 17:11
Hai,

ist es irgendwie möglich, die Dateiversion einer DLL mit Access auszulesen?

Besten Dank im voraus - ogl

struppi
06.11.2001, 20:22
Hallo
Das geht zb mit dem Scripting.Filesystemobject:

dim fso as Object, Version as string
set fso = CreateObject("Scripting.FileSystemObject")

Version = fso.GetFileVersion("Pfad zu dll")
Msgbox "Die .dll hat Verion: " & Version

Vorher kann man noch prüfen ob die Datei existiert usw (if fso.FileExists(Pfad zur Datei) = true......)

Sascha Trowitzsch
06.11.2001, 20:36
Erzeuge ein neues Modul und kopier den folgenden Code rein:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>

<span class="TOKEN">Private</span> <span class="TOKEN">Type</span> VS_FIXEDFILEINFO
dwSignature <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwStrucVersionl <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwStrucVersionh <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwFileVersionMSl <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwFileVersionMSh <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwFileVersionLSl <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwFileVersionLSh <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwProductVersionMSl <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwProductVersionMSh <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwProductVersionLSl <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwProductVersionLSh <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
dwFileFlagsMask <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwFileFlags <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwFileOS <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwFileType <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwFileSubtype <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwFileDateMS <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
dwFileDateLS <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">End</span> <span class="TOKEN">Type</span>

<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetFileVersionInfo <span class="TOKEN">Lib</span> "Version.dll" <span class="TOKEN">Alias</span> "GetFileVersionInfoA" (<span class="TOKEN">ByVal</span> lptstrFilename <span class="TOKEN">As</span> String, <span class="TOKEN">ByVal</span> dwhandle <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> dwlen <span class="TOKEN">As</span> Long, lpData <span class="TOKEN">As</span> Any) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetFileVersionInfoSize <span class="TOKEN">Lib</span> "Version.dll" <span class="TOKEN">Alias</span> "GetFileVersionInfoSizeA" (<span class="TOKEN">ByVal</span> lptstrFilename <span class="TOKEN">As</span> String, lpdwHandle <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> VerQueryValue <span class="TOKEN">Lib</span> "Version.dll" <span class="TOKEN">Alias</span> "VerQueryValueA" (pBlock <span class="TOKEN">As</span> Any, <span class="TOKEN">ByVal</span> lpSubBlock <span class="TOKEN">As</span> String, lplpBuffer <span class="TOKEN">As</span> Any, puLen <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Sub</span> MoveMemory <span class="TOKEN">Lib</span> "kernel32" <span class="TOKEN">Alias</span> "RtlMoveMemory" (dest <span class="TOKEN">As</span> Any, <span class="TOKEN">ByVal</span> Source <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> length <span class="TOKEN">As</span> <span class="TOKEN">Long</span>)


<span class="TOKEN">Public Function</span> DisplayVerInfo(strFile <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> Res <span class="TOKEN">As</span> String, rc <span class="TOKEN">As</span> Long, lDummy <span class="TOKEN">As</span> Long, sBuffer() <span class="TOKEN">As</span> <span class="TOKEN">Byte</span>
<span class="TOKEN">Dim</span> lBufferLen <span class="TOKEN">As</span> Long, lVerPointer <span class="TOKEN">As</span> Long, lVerbufferLen <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> udtVerBuffer <span class="TOKEN">As</span> VS_FIXEDFILEINFO

lBufferLen = GetFileVersionInfoSize(strFile, lDummy)
<span class="TOKEN">If</span> lBufferLen < 1 <span class="TOKEN">Then</span> DisplayFileInfo = "": <span class="TOKEN">Exit Function</span>
<span class="TOKEN">ReDim</span> sBuffer(lBufferLen)
rc = GetFileVersionInfo(strFile, 0&, lBufferLen, sBuffer(0))
rc = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerbufferLen)
MoveMemory udtVerBuffer, lVerPointer, Len(udtVerBuffer)
DisplayVerInfo = Format$(udtVerBuffer.dwFileVersionMSh) & "." & Format$(udtVerBuffer.dwFileVersionMSl) & "." & Format$(udtVerBuffer.dwFileVersionLSh) & "." & Format$(udtVerBuffer.dwFileVersionLSl)
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>

Du kannst dann die Versionsnummer einer Datei mit dem Aufruf von "DisplayVerInfo" als String zurückbekommen. Beispiel:

Msgbox DisplayVerInfo("D:\WINNT\SYSTEM32\kernel32.dll")

Wenn die Datei keine Versionsnummer enthält oder sonstwas nicht stimmt, dann wird ein leerer String zurückgegeben.

Ciao, Sascha

PS: Shit, da hat Struppi natürlich was einfacheres!
[Dieser Beitrag wurde von Sascha Trowitzsch am 06.11.2001 editiert.]

ogl
07.11.2001, 09:18
!!! VIELEN DANK !!!

ogl
07.11.2001, 13:39
Hallo Sascha,

deine Variante rennt, es gibt bloß einen kleinen Fehler in
If lBufferLen < 1 Then DisplayFileInfo = "": Exit Function
hier muß statt "DisplayFileInfo" "DisplayVerInfo" stehen. Ansonsten alles perfekt - vielen Dank nochmal.

Hallo Struppi,
deine Variante gefällt mit natürlich noch besser, da wesentlich kürzer.
Leider bekomm ich zur Laufzeit den Fehler 'Laufzeitfehler 438: Objekt unterstützt diese Eigenschaft oder Methode nicht' (Verweis zu Microsoft Scripting Runtime habe ich hinzugefügt)
Im Objektkatalog der Bibliothek "Scripting" Klasse "FileSystemObject" gibt es auch keine Memberfunction "GetFileVersion"!?

Wie bekomm ich diese Variante zum Laufen??

Grüße - ogl

Sascha Trowitzsch
07.11.2001, 16:26
Eigenartig!

Bei mir ist GetFileVersion vorhanden - auch im Objektkatalog.
Heißt deine Scripting Runtime denn auch scrrun.dll? (im System-Verzeichnis)

Meine scrrun-Version ist 5.1.0.5010
Die dll ist Bestandteil des IExplorer. Vielleicht musst du den mal updaten.

Ciao, Sascha

ogl
07.11.2001, 17:11
Hi Sascha,

die Scripting Runtime heißt C:\WINNT\system32\scrrun.dll (Version 5.0.0.3715 - AHA!!!).
Meine IE-Version ist die 5.00.2314.1003CO.

Ich hab auch grad mal auf meinem WIN98-IE4-OFF97-Notebook nachgeguckt, da hat die scrrun.dll die Version 3.1.0.2230 !!!

Mist, da muß ich also doch die längere Variante nutzen, is ja aber besser als garnix ;-))

vielendanknochmal - ogl

Sascha Trowitzsch
07.11.2001, 17:57
Warum holst du dir nicht die neueste aufs System?
Die 3 beim Notebook heißt nur, es ist W98.
5 heißt W2k.

Den IExplorer gibt's doch fast auf jeder CD-Beilage irgendweiner Zeitschrift.
Du musst da nur in den CAB-Dateien nach der scrrun suchen, sie ins System-Verzeichnis kopieren und neu registrieren (regsrv32)

Ciao, Sascha

ogl
09.11.2001, 15:35
Hi Sascha,

da hast Du natürlich Recht, wenn da nicht die Tatsache wäre, daß das Frontend auf ca. 30 NT-Clients laufen wird, die völlig homogenen sind und auf denen keine DLL´s augetauscht werden dürfen. Da habe ich leider keine Chance ...

Ciao - ogl