Geschrieben von: Christoph Wille
Kategorie: Komponenten
This printed page brought to you by AlphaSierraPapa
Als ASP Programmierer verwendet man Komponenten - ein Administrator installiert sie (üblicherweise). Meist geschieht der Aufruf der Komponente über ihre ProgID, die sehr selten Auskunft über die Version gibt. Noch viel seltener erfährt man, wo die Komponente gespeichert ist - was beim Aufsetzen oder Fehlersuchen hin und wieder hilfreich sein soll.
Wie kommt man nun an die Versionsinformation heran? Nun, diese ist in der DLL oder EXE Datei gespeichert, in der die Komponente "lebt". Mit nur der ProgID in der Hand, wie komme ich da an den Dateinamen, noch nicht redend von wie lese ich die Versionsinformation aus? Die gute Nachricht ist, es geht. Die noch bessere - man muß es nicht selbst programmieren, es gibt dafür eine Komponente.
Im heutigen Artikel verwende ich die VersionInfo Komponente, die ich selbst vor nun doch schon einiger Zeit programmiert habe. Da die Komponente gratis ist, habe ich auch kein schlechtes Gewissen, sie sozusagen zu "bewerben". Übrigens sind auch alle anderen bei IISDEV zu findenden Komponenten gratis.
Wie funktioniert die VersionInfo Komponente? Ich teile ihr mit, welche ProgId ich kenne, und sie geht dann in der Registrierdatenbank "auf die Jagd" nach der zugehörigen Datei, aus der die Komponente dann sämtliche Versioninformation ausliest - die ich dann wiederum in ASP anzeigen lassen kann. Und genau so ein Formular bauen wir uns heute.
Unser Formular müßte eigentlich nur ein Textfeld zur Verfügung stellen - damit man eine ProgId wie zB ADODB.Connection eintippen kann. Um die Arbeit aber zu vereinfachen habe ich dem Formular eine weitere DropDown-Box spendiert: damit der Benutzer eine vordefinierte ProgId auswählen kann. Sie sind herzlich eingeladen, diese Liste nach Ihren Wünschen umzugestalten.
<FORM ACTION="<%= Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST"> <TABLE CELLSPACING="2" CELLPADDING="2"> <TR> <TD>Prog ID: </TD> <TD><INPUT TYPE="Text" NAME="ProgID"></TD> <TD><SELECT NAME="ProgID"> <OPTION Value ="">- Select - <OPTION>ADODB.Connection <OPTION>ADODB.Recordset <OPTION>Scripting.FileSystemObject <OPTION>Scripting.Dictionary <OPTION>MSWC.ContentRotator <OPTION>MSWC.NextLink </SELECT></TD> <TD><INPUT TYPE="Submit" NAME="Submit" VALUE="Versioninfo ermitteln"></TD> </TR> </TABLE> </FORM>
Zurückkommend auf den Formularcode aus der vorangegangenen Sektion - sowohl das Textfeld als auch die DropDown-Box haben den gleichen Namen. Warum? Damit ich in einer einzigen For...Next Schleife die eingegebene oder selektierte ProgId auslesen kann.
<% For intI = 1 to Request.Form("ProgID").Count strProgID = Trim(Request.Form("ProgID")(intI)) If strProgID <> "" Then Response.Write "<B>You have queried for " & strProgID & "</B><BR>" Response.Write Replace(GetProgIDInfo(strProgID),vbCrLf,"<BR>" & vbCrLf) Response.Write "<BR>" & vbCrLf End If Next %>
Der Grund für die For...Next Schleife ist nun klar. Wo aber rufe ich die VersionInfo Komponente auf? Dies passiert in den Funktion GetProgIDInfo:
<% Function GetProgIDInfo(strProgID) Dim xObj, bResult, strResult Dim aKeys, i, strOut Set xObj = Server.CreateObject("Softwing.VersionInfo") bResult = xObj.GetByProgId(strProgID) If 1 <> bResult Then strOut = "Could not load " & strProgID Else strOut = strOut & "ProgID: " & strProgID & vbCrLf If 1 <> xObj.IsMtxObject() Then aKeys = Array("CompanyName", "FileDescription", "FileVersion", _ "InternalName", "LegalCopyright", "OriginalFilename", _ "ProductName", "ProductVersion") For i = 0 To UBound(aKeys) strValue = strValue & aKeys(i) & ": " & xObj.GetValue(aKeys(i)) & vbCrLf Next strOut = strOut & strValue & vbCrLf strResult = "File Name: " & xObj.FileName & vbCrLf ' please see declares.vbs for the numeric values to which you could compare strResult = strResult & "Major Version: " & xObj.MajorVersion & vbCrLf strResult = strResult & "Minor Version: " & xObj.MinorVersion & vbCrLf strResult = strResult & "File Flags: " & xObj.FileFlags & vbCrLf strResult = strResult & "File OS: " & xObj.FileOS & vbCrLf strResult = strResult & "File Type: " & xObj.FileType & vbCrLf Else strResult = "This object is hosted in transaction server..." End If strOut = strOut & strResult End If Set xObj = Nothing GetProgIDInfo = strOut End Function %>
Der VersionInfo Komponente übergebe ich die abzufragende Komponenten-ProgId in der folgenden Zeile:
bResult = xObj.GetByProgId(strProgID)
Sollte die ProgId nicht gefunden werden können, ist der Wert von bResult False (und der Fehler wird ausgegeben). Weiter geht es mit einer etwas eigenartigen Abfrage:
If 1 <> xObj.IsMtxObject() Then ... Else strResult = "This object is hosted in transaction server..." End If
Für Objekte die in MS Transaction Server (oder COM+ Applications) gehostet werden, kann die VersionInfo Komponente keine Versionsinformation ermitteln. Aber durch diese Abfrage wird zumindest ein entsprechender Hinweis ausgegeben (der für sich alleine schon nützlich sein kann).
Nun wissen wir, daß die VersionInfo Komponente ihren Dienst verrichtet hat, und wir nur noch die Versionsinformationen auslesen müssen. Alle benannten Versioninformationen werden mittels GetValue ausgelesen, die Versionsnummern können über Eigenschaften des Objekts ermittelt werden.
Sind alle Informationen gesammelt, werden diese als Stringrückgabewert an den Aufrufer zurückgegeben - und im Falle unseres Scripts an den Benutzer geschickt.
Sehen wir uns einmal an, wie das Skript seine Arbeit verrichtet:
Warum habe ich mir das FileSystemObject ausgesucht? Weil das ein besonders gutes Beispiel für eine Komponente ist, mit der man unter Umständen Probleme bekommen kann (die nachfolgenden Informationen stammen von einer anderen Maschine):
You have queried for Scripting.FileSystemObject ProgID: Scripting.FileSystemObject CompanyName: Symantec Corporation FileDescription: ScriptBlocking FileVersion: 1, 0, 0, 32 InternalName: ScrBlocking LegalCopyright: Copyright © 2000 OriginalFilename: ScrBlock.dll ProductName: Symantec ScriptBlocking ProductVersion: 1, 0, 0, 32 File Name: C:\Program Files\Common Files\Symantec Shared\Script Blocking\scrblock.dll Major Version: 1 Minor Version: 0 File Flags: 0 File OS: 4 File Type: 1
Ja, der Norton AntiVirus 2001 hat hier zugeschlagen - dieser ersetzt einige als gefährlich eingestufte Komponenten mit eigenen "Blockern" - was bei ASP zu mittelschweren Problemen führen kann! Also ein gutes Beispiel, wo die VersionInfo Komponente Probleme lösen helfen kann - nicht zu reden, daß man für ADO einfach und schnell die Version ermitteln kann.
Es ist niemals schlecht, einfach herausfinden zu können, wo eine Komponente liegt, und um welche Version es sich genau handelt.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010405.zip
IISDEV Gratiskomponenten
http://www.alphasierrapapa.com/IisDev/Components/
VersionInfo Komponente Download
http://www.alphasierrapapa.com/IisDev/Components/VersionInfo/
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.