Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Komponente Y - welche Version bist Du?

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.

Das Formular

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>

Der Code

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.

Versioninformationen ermitteln

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.

Schlußbemerkung

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

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010405.zip

Links zu anderen Sites

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.