_GetSoftwareVersion(Versionsnr. aus Registry auslesen)

    • Offizieller Beitrag

    Mit dieser Funktion kann man von diversen Programmen die installierte Version aus der Registry auslesen.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    ;~ _GetSoftwareVersion_DisplayIni()

    [/autoit] [autoit][/autoit] [autoit]

    $sVersion = _GetSoftwareVersion('firefox')
    ConsoleWrite('Error: ' & @error & @CR)
    MsgBox(0, 'Version', $sVersion)

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetSoftwareVersion($sSoftware)
    Local $sRegKey, $sVersion, $sInifile, $sTmp, $aSoftware
    $sInifile = @ScriptDir & '\_GetSoftwareVersion.ini'
    If @OSArch = 'X86' Then
    $sRegKey = 'HKEY_LOCAL_MACHINE\SOFTWARE\'
    Else
    $sRegKey = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\'
    EndIf
    $aSoftware = IniReadSectionNames($sInifile)
    If @error Then Return SetError(1, 0, 'no Inifile')
    For $i = 1 To $aSoftware[0]
    If $aSoftware[$i] = $sSoftware Then
    $sRegKey &= IniRead($sInifile, $aSoftware[$i], 'RegKey', '')
    $sTmp = IniRead($sInifile, $aSoftware[$i], 'Version', '')
    If StringLeft($sTmp, 3) = 'Reg' Then $sVersion = Execute($sTmp)
    Return $sVersion
    EndIf
    Next
    Return SetError(2, 0, 'not found')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetSoftwareVersion_DisplayIni()
    Local $sInifile, $aSoftware
    $sInifile = @ScriptDir & '\_GetSoftwareVersion.ini'
    $aSoftware = IniReadSectionNames($sInifile)
    If @error Then Return SetError(1, 0, 'no Inifile')
    Local $aRegKey[$aSoftware[0] + 1][3] = [[$aSoftware[0], 0, 0]]
    For $i = 1 To $aSoftware[0]
    $aRegKey[$i][0] = $aSoftware[$i]
    $aRegKey[$i][1] = IniRead($sInifile, $aSoftware[$i], 'RegKey', '')
    $aRegKey[$i][2] = IniRead($sInifile, $aSoftware[$i], 'Version', '')
    Next
    _ArrayDisplay($aRegKey)
    EndFunc

    [/autoit]

    Außerdem wird die folgende Inidatei benötigt:

    Spoiler anzeigen


    Die Inidatei muss sich im Scriptverzeichnis befinden!
    Auf diese Weise läßt sich die Funktionalität einfacher erweitern. Man muss nur die Inidatei anpassen. :)

    Die zweite Funktion "_GetSoftwareVersion_DisplayIni()" dient nur dazu, sich den Inhalt der Inidatei anzeigen zu lassen. ;)

  • Hallo Oscar


    Die Idee ist ja nicht schlecht, aber du kannst nur auslesen, was du genau kennst.

    Warum machst du nicht einen Loop über den Uninstall part der Registry und suchst den eintrag?

    So musst du keine Liste pflegen.


    Gruss Roger

  • @Roger
    Dann programmier das einfach doch mal und zeig es hier dann wenn es wirklich zuverlässig funktioniert.

    Ganz ehrlich: Es gibt kein festes Format wie bzw. ob ein Programm seine Programmversion hinterlegt.
    Deswegen wird das wie du es vorschlägst wohl schwerlich funktionieren denn den Eintrag "DisplayVersion" den du sicherlich meinst wird nicht immer genutzt.
    Eine dynamische Lösung für alle Programme wird es damit nicht geben.

    Einmal editiert, zuletzt von AspirinJunkie (11. Dezember 2009 um 11:56)

  • wie bekomme ich denn die genaue Adobe Reader Version. Er spuckt mir immer nur Version 9 aus, obwohl 9.2 installiert ist. Auch bei 9.3 wird nur 9 angezeigt.
    Ist das nur bei mir so ?

    Nachtrag:

    [autoit]

    FileGetVersion

    [/autoit]

    gibt die korrekte Version zurück, wenn man die auf die AcroRd32.exe anwendet.
    besonders schöne finde ich diese Lösung nicht, aber funktioniert.

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    Einmal editiert, zuletzt von franzp (14. Januar 2010 um 16:43)

  • Wie müsste das Skript aussehen, wenn folgende Bedingungen noch hinzukämen - sozusagen eine Erweiterung des Skripts zu einem Automatischen Update-Programm:

    1. Das Skript vergleicht die Programmversion des auf dem Computer installierten Programms, wie z.B. Firefox (Version 2.0.0), mit einer anderen Programmversion von Firefox (z.B. 3.5.0 (= fester Wert im Quelltext) ).

    2. Danach wird dem Benutzer entweder die Nachricht "Firefox ist auf dem aktuellen Stand", oder die Nachricht
    "Es ist eine aktuellere Version von Firefox verfügbar. Möchten Sie die aktuelle Version installieren?" auf dem Bildschirm ausgegeben.

    3. Der Benutzer klickt dann seinen Wünschen entsprechend einen [ Ja ]- oder [ Nein ]-Button an.

    4. Demenstsprechend startet dann eine "Setup.exe"-Installationsroutine oder nicht (Pfad der "Setup.exe" = ebenfalls fester Wert im Quelltext).


    => Ich müsste dann zwar per Hand die aktuelle Version des jeweiligen Programmes sowie den Pfad der jeweiligen Setup.exe-Datei einzeln eingeben - aber so würde ich es mir wünschen...

    Grüße
    Bob

    2 Mal editiert, zuletzt von BobBootinger (4. Februar 2010 um 15:27)

  • Hallo GtaSpider,

    erstmal besten Dank für die Antwort. Ich hab mir das gerade mal in der Hilfe angesehen.
    Nur hab ich gerade ein Problem, weil ich nicht genau weis wann und wo ich _VersionCompare bzw. MsgBox bzw. Run im Code einsetzen muss, sodass das Programm dann letztlich macht, was ich möchte.

    Ich muss auch sagen, ich bin mit AutoIt eigentlich noch gar nicht vertraut, denn ich bin erst gestern darauf gestoßen...

    Ich wär dir also sehr dankbar, wenn du mir da noch etwas auf die Sprünge helfen könntest bezogen auf die Implementierung meiner Funktionen im Code...

    Grüße
    Bob

  • [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <misc.au3>

    [/autoit][autoit][/autoit][autoit]

    $Form1 = GUICreate("Form1", 244, 145, 319, 230,-1,$WS_EX_ACCEPTFILES );,0x00000018)
    $Input2 = GUICtrlCreateInput("Input2", 24, 64, 121, 21)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    $Input1 = GUICtrlCreateInput("Input1", 24, 32, 121, 21)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    $Label1 = GUICtrlCreateLabel("Dateien bitte per drag and drop reinziehen", 24, 8, 202, 17)
    $Label2 = GUICtrlCreateLabel("Datei 1", 160, 32, 38, 17)
    $Label3 = GUICtrlCreateLabel("Datei 2", 160, 64, 38, 17)
    $Button1 = GUICtrlCreateButton("Vergleichen", 56, 96, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $input_data1 = GUICtrlRead($Input2)
    $input_data2 = GUICtrlRead($Input1)
    $version = _VersionCompare($input_data1,$input_data2)
    If $version = -1 Then
    $msg = MsgBox(4,"Version","Die 2. Version ist aktueller. Möchten sie jetzt die neue Version installieren?")
    If $msg = 6 Then Run($input_data2)
    ElseIf $version = 1 Then
    $msg = MsgBox(4,"Version","Die 1. Version ist aktueller. Möchten sie jetzt die neue Version installieren?")
    If $msg = 6 Then Run($input_data1)
    EndIf
    EndSwitch
    WEnd

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Hallo Cartan12,
    zunächst vielen Dank für deinen Code - ich hoffe, ich trete dir mit meiner Kritik nicht zu nahe, aber irgendwie ist es immer noch nicht das, was ich mir ursprünglich vorgestellt hatte, denn es sollte eigentlich eine Erweiterung des Codes von Oskar sein...
    -> Ich glaube, wir haben uns da etwas missverstanden...

    Nochmals zum Verständnis:
    Wie vergleicht deine Implementierung eigentlich die Versionen der beiden Dateien - was wird genau verglichen - der Dateiname, die Programmversion?

    Welche Rolle spielen Dateiendungen in deinem Code?
    Kann die "Firefox_3.5.0_Setup.exe" mit der auf dem Computer installierten Datei "Firefox.exe" verglichen werden
    bzw. darf es sein, dass man eine *.ini-Datei mit einer *.exe-Datei vergleichen kann?


    Ich wäre dir also sehr dankbar, wenn du meine Zusatzbedingungen im Code von Oskar implementieren könntest...


    Grüße
    Bob