dll´s automatisch registrieren

  • was ist an dem code falsch?

    Spoiler anzeigen
    [autoit]


    #RequireAdmin
    IsAdmin()
    #include-once
    #include <Date.au3>
    #include <Array.au3>
    #include <File.au3>
    #include <DateTimeConstants.au3>

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

    Global $sFile,$tFile,$tPath
    Global $sPath = @ScriptDir
    Global $hSearch = FileFindFirstFile($sPath & "\*.dll")
    Global $tSearch = FileFindFirstFile($tPath & "\*.dll")

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

    If @OSArch = "64" Then
    $tPath = "\%Systemroot%\System32\" ;Die 64-Bit-Version ist
    Else
    If @OSArch = "86" Then
    $tPath = "\%Systemroot%\SysWoW64\" ;Die 32-Bit-Version ist
    EndIf
    EndIf

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

    If $hSearch = -1 Then
    TrayTip("Info", "Keine neuen DLLs enthalten ! ", 5, 1)
    Sleep(1250)
    TrayTip("clears any tray tip", "", 0)
    Exit
    EndIf

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

    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $tFile = FileFindNextFile($tSearch)
    If @error Then _Neu()
    _Version()
    ExitLoop
    WEnd

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

    Func _Neu()
    FileCopy($sFile , $tPath, 9)
    Sleep(50)
    ShellExecute("regsvr32.exe" , "'" & $tPath & "\" & $sFile & "'")
    ConsoleWrite("Dll registriert: " & $sFile & @CRLF)
    Sleep(50)
    Exit
    EndFunc

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

    Func _Version()

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

    Local $Fileversion1 = FileGetVersion($hSearch, 1)
    If @error Then _Time()
    Local $Fileversion2 = FileGetVersion($tSearch, 1)
    If @error Then _Time()

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

    If $Fileversion1 > $Fileversion2 Then
    FileDelete($Fileversion2)
    Sleep(50)
    FileCopy($Fileversion1 , $Fileversion2, 9)
    Sleep(50)
    ShellExecute("regsvr32.exe" , ' /s ' & $tPath & "/" & $tFile & "'")
    ConsoleWrite("Dll registriert: " & $tFile & @CRLF)
    Sleep(50)
    Else
    FileDelete($Fileversion1)
    Sleep(50)
    ConsoleWrite("KEINE Dll registriert: " & $tFile & @CRLF)
    Sleep(50)
    Endif

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

    EndFunc

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

    Func _Time()

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

    Local $File1 = FileGetTime($hSearch, 1)
    Local $File2 = FileGetTime($tSearch, 1)

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

    If Not @error Then
    If $File1[0]>$File2[0] or $File1[1]>$File2[1] or $File1[2]>$File2[2] or $File1[3]>$File2[3] or $File1[4]>$File2[4] then ; mit [5] haste auch noch die Sekunden ;)
    FileDelete($File2) ;oder du machst FileCopy und mit dem flag das er es überschreiben soll ;) FileCopy("Pfad wo es jetzt liegt", "Pfadwo es hin soll",1) die 1 heisst überschreiben
    Sleep(50)
    FileCopy($File1, $File2, 9)
    Sleep(50)
    ShellExecute("regsvr32.exe", "'" & $tPath & "\" & $tFile & "'")
    ConsoleWrite("Dll registriert: " & $tFile & @CRLF)
    TrayTip("Info", "Dll registriert: " & $tFile & @CRLF , 5, 1)
    Sleep(2500)
    TrayTip("clears any tray tip", "", 0)
    Sleep(50)
    Else
    FileDelete($File1)
    Sleep(50)
    ConsoleWrite("KEINE Dll registriert: " & $tFile & @CRLF)
    TrayTip("KEINE Dll registriert:", "$tFile & @CRLF " , 5, 1)
    Sleep(2500)
    TrayTip("clears any tray tip", "", 0)
    Sleep(50)
    Endif
    EndIf
    ;$Filex[0] = year (four digits) x steht für die jeweilige Zahl ;)
    ;$Filex[1] = month (range 01 - 12)
    ;$Filex[2] = day (range 01 - 31)
    ;$Filex[3] = hour (range 00 - 23)
    ;$Filex[4] = min (range 00 - 59)
    ;$Filex[5] = sec (range 00 - 59)
    EndFunc

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


  • Was ist an diesem Thread falsch? Genau es mangelt an jeglicher Fehlerbeschreibung.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • was ist an dem code falsch?

    Die Frage ist eher, was überhaupt richtig ist. Alleine beim Überfliegen der ersten Zeilen sehe ich schon etliche Fehler.

    1. Du rufst isAdmin() auf kümmerst dich aber nicht um das Ergebnis, also kannste die Zeile auch weglassen.
    2. Du deklarierst die Variablen $tPath, durchs Deklarieren hat diese Variable aber noch garkeinen Inhalt.

    [autoit]


    Global $sFile,$tFile,$tPath

    [/autoit]


    3. Diese leere Variablen verwendest du nun um ein Suchhandel zu bekommen, was natürlich nichts bzw. nur einen Fehler zurückgeben dürfte

    [autoit]

    Global $tSearch = FileFindFirstFile($tPath & "\*.dll")

    [/autoit]


    4. Jetzt wo es schon zu spät ist versuchst du $tPath mit Inhalt zu befüllen, das machst du aber falsch

    [autoit]

    If @OSArch = "64" Then
    $tPath = "\%Systemroot%\System32\" ;Die 64-Bit-Version ist
    Else
    If @OSArch = "86" Then
    $tPath = "\%Systemroot%\SysWoW64\" ;Die 32-Bit-Version ist
    EndIf
    EndIf

    [/autoit]

    Warum?

    Zitat von Hilfe

    @OSArch --> Gibt eines der folgendes zurück:"X86","IA64","X64" - dies ist der Architekturtyp des aktuell laufenden Betriebssystems.

    Du prüfst also auf ungültige Werte, somit wird deine Variable keinen Inhalt haben, aber dafür ists ja ohnehin zu spät...

    5. Du hast eine while Schleife, die grundsätzlich nach dem ersten Durchlauf verlassen wird, wozu dann überhaupt eine Schleife?

    [autoit]

    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $tFile = FileFindNextFile($tSearch)
    If @error Then _Neu()
    _Version()
    ExitLoop ; <--------------------- Verlässst die Schleife !!!!
    WEnd

    [/autoit]

    Ich habe hier dann aufgehört weiter zu suchen, vermutlich schlummern aber noch mehr Fehler im Code.

  • Ahja nochmal was:

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

    Func _Version()

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

    Local $Fileversion1 = FileGetVersion($hSearch, 1)
    If @error Then _Time()
    Local $Fileversion2 = FileGetVersion($tSearch, 1)
    If @error Then _Time()

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

    If $Fileversion1 > $Fileversion2 Then
    FileDelete($Fileversion2)
    Sleep(50)
    FileCopy($Fileversion1 , $Fileversion2, 9)
    Sleep(50)
    ShellExecute("regsvr32.exe" , ' /s ' & $tPath & "/" & $tFile & "'")
    ConsoleWrite("Dll registriert: " & $tFile & @CRLF)
    Sleep(50)
    Else
    FileDelete($Fileversion1)
    Sleep(50)
    ConsoleWrite("KEINE Dll registriert: " & $tFile & @CRLF)
    Sleep(50)
    Endif

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

    EndFunc

    [/autoit]

    Du vergleichst hier zwei Strings miteinander, das wird sehr wahrscheinlich nicht das gewünschte Ergebnnis liefern, sondern eher zufällige Ergebnisse. In deinem Fall verwendest du im Übrigen auch noch einen ungültigen Wert für den 1. Parameter (Suchhandele statt Dateiname) und einen falschen 2. Parameter von filegetversion() (Zahl statt String, siehe Hilfe). Das Ergebnis ist daher immer ein leerer String.

    Wenn du zwei Dateiversionen vergleichen willst verwende

    [autoit]


    #Include <Misc.au3>
    _VersionCompare($sVersion1, $sVersion2)

    [/autoit]

    Danach willst du die ältere von beiden Dateien löschen, aber dann solltest du dazu wohl auch den Dateipfad angeben und nicht die Versionsnummer. Eine Versionsnummer kannst du schlecht löschen. Genausowenig kannst du Versionsnummern kopieren.

    Die selben Fehler machst du auch in deiner Funktion _Time(). Du verwendest falsche Parameter um die Erstellzeit zu ermitteln und du versuchst Uhrzeiten zu löschen bzw. zu kopieren.

    Einmal editiert, zuletzt von misterspeed (18. Mai 2013 um 12:57)

  • Sorry für den tripple Post, aber jetzt weiß ich auch wieder wer du bist. Du warst der "Updater-Thread Typ", davon ab hast du schon etliche Threads zum Thema DLL registrieren / Version prüfen. Gelernt hast du aus deinen vergangenen Threads scheinbar nichts. Du solltest mal anfangen die Hilfe zu lesen und weniger Copy & Paste Programmierung betreiben.