Komponente Y - welche Version bist Du?
Geschrieben von: Christoph Wille 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. Das FormularUnser 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> Der CodeZurü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. Versioninformationen ermittelnSehen 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. SchlußbemerkungEs ist niemals schlecht, einfach herausfinden zu können, wo eine Komponente liegt, und um welche Version es sich genau handelt. Download des CodesKlicken Sie hier, um den Download zu starten. Links zu anderen Sites
IISDEV Gratiskomponenten Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |