1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • WinMove / GUI - Größe ändern ?

    • misterspeed
    • 1. Januar 2014 um 19:52

    Wie wäre es wenn du einen Beispielcode schreibst der das Problem veranschaulicht? Die zwei Zeilen da oben sind jedenfalls unbrauchbar um das ganze zu testen und ich bin zu Faul mir die restliche GUI selbst zu schreiben...

  • ImageSearch funktioniert nicht.

    • misterspeed
    • 1. Januar 2014 um 19:35
    Zitat von Chulio

    Ka was genau du meinst, weil...

    3.) rechtsklick ausführen (x86) -> "AutoIt v3 Script funktioniert nicht mehr...Programm schliessen"
    in SciTE -> "AutoIt v3 Script funktioniert nicht mehr...Programm schliessen"

    rechtsklick ausführen (x64) ->

    Status:
    Es konnte keine Übereinstimmung ermittelt werden!


    Wenn du nur ein klein wenig nachdenkst und mal einen Blick auf den Code wirfst den ich dir gegeben habe bzw. die Hilfe zu den von mir verwendeten Befehlen nachschlägst sollte dir klar werden, dass du die Debug Meldung, welche ich eingebaut habe nur in der Scite console sehen kannst. Das Ausführen per Rechtsklick auf die "au3" wird dich als nicht weiter bringen wenn es darum geht den Fehler zu finden. Du musst das Script also in Scite ausführen. Dabei musst du selbstverständlich darauf achten, dass du das Script in 64bit ausführst wenn du eine 64bit DLL verwendest bzw. eben als 32bit Version wenn du eine 32bit DLL verwendest (ansonsten Absturz...).

    Das erzwingt man in dem man eine der folgenden Zeilen an den Scriptanfang setzt

    [autoit]


    #AutoIt3Wrapper_UseX64=N ; 32bit
    #AutoIt3Wrapper_UseX64=Y ; 64bit

    [/autoit]

    Wenn in der console keine Meldung erscheint wird wohl in der Tat nichts gefunden, wenn meine Debug Meldung erscheint, dann solltest du anhand des Fehlercodes des DLL calls den Fehler eingrenzen können.

  • Übergabe eines Kommandozeilenergebnisses an Variable

    • misterspeed
    • 1. Januar 2014 um 18:21

    Verdammt!

    Hier eine Fassung, die sowohl für DOS commands, als auch normale Programmaufrufe mit und ohne Leerzeichen im Pfad funktionieren sollte:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>

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

    ; DOS-Befehl mit Parameter ausführen
    $sProgram = 'dir'
    $sParam = '*.*'
    $sOut = getCmdOut($sProgram,$sParam,True)
    ConsoleWrite($sOut & @CRLF)
    ConsoleWrite(@CRLF & "-----------------------------------" & @CRLF)

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

    ; Normaler Befehl mit Parameter ausführen (Pfad mit Leerzeichen)
    $sProgram = 'C:\Program Files\RevoUninstaller\RevoCmd.exe'
    $sParam = '/m keepass'
    $sOut = getCmdOut($sProgram,$sParam)
    ConsoleWrite($sOut & @CRLF)
    ConsoleWrite(@CRLF & "-----------------------------------" & @CRLF)

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

    ; Normaler Befehl ohne Parameter ausführen (Pfad mit Leerzeichen)
    $sProgram = 'C:\Program Files\RevoUninstaller\RevoCmd.exe'
    $sOut = getCmdOut($sProgram)
    ConsoleWrite($sOut & @CRLF)

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

    Func getCmdOut($sProg,$sParam="",$dosCMD=False)
    Local $pid
    Local $sReturn

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

    If $dosCMD Then
    If $sParam = "" Then
    $pid = Run(@ComSpec & " /c " & $sProg, "", @SW_HIDE, $STDOUT_CHILD)
    Else
    $pid = Run(@ComSpec & " /c " & $sProg & ' ' & $sParam, "", @SW_HIDE, $STDOUT_CHILD)
    EndIf
    Else
    If $sParam = "" Then
    $pid = Run('"' & $sProg & '"', "", @SW_HIDE, $STDOUT_CHILD)
    Else
    $pid = Run('"' & $sProg & '" ' & $sParam, "", @SW_HIDE, $STDOUT_CHILD)
    EndIf
    EndIf

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

    While 1
    $sReturn &= StdoutRead($pid)
    If @error Then ExitLoop
    WEnd

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

    Return $sReturn
    EndFunc

    [/autoit]

    EDIT:

    Andy: Backslash bekommste angezeigt wenn du auf

    [autoit]

    '\'

    [/autoit]

    ausweichst ;)

    Der Foren bzw. BB-Code Bug sollte trotzdem behoben werden, nervt irgendwie...

  • Übergabe eines Kommandozeilenergebnisses an Variable

    • misterspeed
    • 1. Januar 2014 um 17:44

    Der Code von PuReIroNie ist auch falsch. Schau dir doch einfach das Beispiel in der Hilfe zu

    [autoit]

    stdoutread

    [/autoit]

    an:


    [autoit]


    ; Demonstriert StdoutRead()
    #include <Constants.au3>

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

    Local $foo = Run(@ComSpec & " /c dir foo.bar", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDOUT gelesen:", $line)
    WEnd

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

    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDERR gelesen:", $line)
    WEnd

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

    MsgBox(0, "Debug", "Wie aufregend...")

    [/autoit]


    Das Beispiel ist zugegebenermaßen nicht optimal, dein Fehler liegt vermutlich auch an der fehlerhaften Bildung des Befehlsstrings für run().

    Du schreibst nämlich:

    [autoit]

    Run("C:\Program Files\RevoUninstaller\RevoCmd.exe" /m keepass* ... Parameter)

    [/autoit]

    Was schonmal einen Syntaxfehler werfen dürfte, da du die Parameter nicht in Anführungszeichen einschließt.

    Richtig wäre eher so:

    [autoit]


    Run("C:\Program Files\RevoUninstaller\RevoCmd.exe /m keepass")

    [/autoit]

    Damit der stdout überhaupt gelesen werden kann muss wie im Hilfebeispiel noch das Flag für $STDOUT_CHILD im run() Aufruf untergebracht werden.

    Hier das überarbeitete Beispiel auf deinen Fall angepasst:

    [autoit]


    #include <Constants.au3>

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

    $sProgram = 'C:\Program Files\RevoUninstaller\RevoCmd.exe'
    $sParam = '/m keepass'

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

    $sOut = getCmdOut($sProgram & " " & $sParam)

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

    ConsoleWrite($sOut & @CRLF)

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

    Func getCmdOut($sExecute)
    Local $pid = Run(@ComSpec & " /c " & '"' & $sExecute & '"', "", @SW_HIDE, $STDOUT_CHILD)
    Local $sReturn

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

    While 1
    $sReturn &= StdoutRead($pid)
    If @error Then ExitLoop
    WEnd

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

    Return $sReturn
    EndFunc

    [/autoit]


    EDIT:

    Tja da war Andy flotter, dafür hab ich ne schöne Funktion draus gemacht. :P

  • PC <-> Mikrocontroller kommunikation via Com

    • misterspeed
    • 1. Januar 2014 um 16:47

    Naja ein erster Schritt zum erfolgreichen Debugging wäre es für jeden Befehl den Rückgabewert und den @error Wert in die scite console ausgeben zu lassen. Diese Ergebnisse kannst du dann nutzen und in der UDF nachsehen was sie bedeuten. Soweit ich das gesehen habe sind die möglichen Fehlerrückgaben in den Funktionsköpfen benannt/dokumentiert.

  • ImageSearch funktioniert nicht.

    • misterspeed
    • 1. Januar 2014 um 15:34

    Du hast leider trotz deines ewig langen Postings nichts zur eigentlichen Frage beigetragen. Was soll überhaupt automatisiert werden? Ohne diese Rückmeldung deinerseits kann man dir auch keine Alternativen vorschlagen.

    Nun zum fehlerhaften Error Handling in der imagesearch.au3:

    Ersetze diesen Code ab Zeile 43 in der imagesearch.au3

    [autoit]


    ; If error exit
    if $result[0]="0" then return 0

    [/autoit]


    mit diesem Code

    [autoit]


    ; If error exit
    If @error <> 0 Then
    ConsoleWrite("Fehler bei DLL Call in Imagesearch.au3 --> Errorcode: " & @error & @CRLF)
    Return 0
    Else
    if $result[0]="0" then return 0
    EndIf

    [/autoit]

    Anschließende Vergleiche den Fehlerrückgabewert in der Scite console mit denen die in der Hilfe zur Funktion

    [autoit]

    dllcall()

    [/autoit]

    aufgelistet werden:

    Code
    Rückgabewert
    Erfolg: 	@error = 0.
    Fehler: 	setzt @error
    @error: 1 Die Dll-Datei kann nicht verwendet werden,
    	2 unbekannter Rückgabewert "return type",
    	3 Funktion "function" wurde in der DLL-Datei nicht gefunden.
    	4 Falsche Anzahl von Parametern.
    	5 Falscher Parameter.
    siehe Bemerkungen.

    Anhand des genauen Fehlers kannst du vielleicht auch herausfinden warum die imagesearch.au3 bei dir scheitert.


    EDIT:

    Ein Blick auf den DLL Call der da scheitert sollte btw auch erklären warum er scheitert:


    [autoit]

    $result = DllCall("C:\ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"ptr",$findImage,"ptr",$HBMP)

    [/autoit]

    Na fällt jemandem was auf? Die DLL muss direkt auf C:\ liegen. Ein weiteres Zeichen für die unglaublich schlechte Programmierfähigkeit des Autors der UDF. Der DLL Pfad sollte nie hardcodet vorliegen, sondern per Variablenübergabe an die Funktion realisiert werden, oder wenn schon hardcodet dann zumindestens das @scriptdir.

  • Automatisierte Installation / Updates

    • misterspeed
    • 1. Januar 2014 um 13:11
    Zitat von sklaim

    Kann als [gelöst] markiert werden :)

    Richtig, aber nicht von mir und auch von sonst niemandem, sondern von dir selbst. Einfach das erste Posting editieren und das Thread Präfix auf "Gelöst" ändern.

  • ImageSearch funktioniert nicht.

    • misterspeed
    • 1. Januar 2014 um 11:55
    Zitat von Chulio

    Zum einen sollte man denke ich nicht immer gleich aufgeben, wenn etwas nicht funktioniert...nur so meine Meinung und zum anderen sollte man eigentlich erwarten, das wenn jemand einem rät andere Wege zu beschreiten, die einen ebenso gut zum Ziel führen könnten, die selben dann auch mal zu nennen. Abgesehen davon gibt es immer andere Wege...das hätte ich mir auch schon vor dem Beitrag denken können. :P

    Zum einen erwartest du scheinbar von uns, dass wir uns mit deinem Problem beschäftigen, die Frage ist also wer hier "immer gleich aufgibt". Warum sollten wir uns mit etwas beschäftigen, dass folgende Punkte erfüllt:

    1. Unzuverlässig
    2. Ineffektiv
    3. Ganz offensichtlich ist die von dir genutzte UDF fehlerhaft bzw. macht kein gescheites Error Handling (der Absturz passiert innerhalb der UDF Funktion, außer du hast Code unterschlagen)
    4. Du postest noch nicht einmal den Link zur UDF. Sollen wir die selbst suchen? Woher sollen wir wissen ob du die aktuellste Version verwendest wenn wir nicht einmal wissen wo du diese her hast?

    Alleine Punkt 1 und 2 sprechen für Alternative Wege, Punkt 3 spricht ebenfalls gegen die Nutzung. Punkt 4 ist dein Verschulden und erschwert die Fehlersuche.

    Nun zu deinem Vorwurf, dass wir die Alternativen nennen sollten, wenn es denn welche gibt. Hier bleibt anzumerken, dass man nur dann konkrete Alternativen nennen kann wenn man die Aufgabe kennt. Auch hier bist du uns eine Antwort schuldig, denn ich sehe nirgendwo auch nur einen Satz von dir in dem du dein vorhaben bzw. das Ziel des Vorhabens beschreibst.

    Also vielleicht erstmal den Fehler am eigenen Verhalten suchen bevor du anderen den Vorwurf machst nicht besonders hilfreich zu sein.


    Zitat von Chulio

    Und vor allem gibt es auch andere wege als AutoIt.

    Dann hast du ja eigentlich kein Problem? Davon ab ist die Nutzung einer DLL (was diese UDF ja tut) ohnehin kein Einsatz von nativem Autoit. Du könntest die DLL auch in vielen anderen Sprachen ansprechen.


    Zitat von Chulio

    Wie wäre es mal abwechselungsweise mit einem Post, der als Hilfestellung zu betrachten ist? Mein ich nicht böse, aber ich suche hier nach einer Lösung!

    Meine ich auch nicht böse, aber wie oben erwähnt ist der erste Schritt zu brauchbarer Hilfe eine brauchbare Fragestellung und das Bereitstellen aller relevanten Ziele / Informationen / Links.

  • Webseiten ansprechen im Hintergrund

    • misterspeed
    • 31. Dezember 2013 um 16:33

    Ahja und am besten mal hier lesen, alles andere macht keinen Sinn wenn schon tausend API's zur Verfügung stehen sollte man diese auch nutzen:

    https://blockchain.info/api

  • Webseiten ansprechen im Hintergrund

    • misterspeed
    • 31. Dezember 2013 um 16:26

    Für den Kurs braucht man die IE Funktionen nicht, das ginge auch so:

    [autoit]


    #include <string.au3>

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

    $site = "http://markets.blockchain.info/markets/mtgox/EUR"
    $source = BinaryToString(inetread($site,16+1))

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

    $aKurs = _StringBetween($source,"<span id='last_price'>","</span>")

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

    If $aKurs <> 0 Then
    ConsoleWrite("Der aktuelle Kurs lautet: " & $aKurs[0] & @CRLF)
    Else
    MsgBox(0,"Fehler","Kurs String wurde nicht gefunden")
    EndIf

    [/autoit]
  • GetItem ID

    • misterspeed
    • 31. Dezember 2013 um 13:25
    [autoit]


    $hwin = WinGetHandle("windows", "Adresse: C:\windows")
    $iItem = ControlListView ( $hwin, "", "[CLASS:DirectUIHWND; INSTANCE:3]", "FindItem", "HelpPane.exe")

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

    ConsoleWrite($hwin & @CRLF)
    ConsoleWrite($iItem & @CRLF)

    [/autoit]

    Prinzipiell so. Allerdings funktioniert der Code so nicht mit dem Windows Explorer unter Windows 7. Liegt sehr wahrscheinlich daran, dass dort kein Standardlistview mehr verwendet wird oder ich mit au3info nicht an das richtige Hanlde des Listviews rangekommen bin.
    Für ein eigenes oder Standard Listview sollte der Code nach Anpassung des Fensterhandles und der Control ID aber funktionieren.

    Andere Frage... wozu braucht man Zugriff auf den Windows Explorer auf diese weise?

  • Wie kann man Funktionen im Tray Menü unabhängig voneinander ausführen?

    • misterspeed
    • 31. Dezember 2013 um 12:31

    Das Problem ist wie schon erwähnt wurde, dass sowohl msgbox() als auch sleep() (Script oben...) blockierende Funktionen sind. Außerdem hast du das Problem, dass Autoit kein Multithreading unterstützt, d.h. einzelne Funktionen oder Befehle können nicht paralell, sondern nur nacheinander ausgeführt werden. Echte paralelle Ausführung ist in Autoit nur durch separate Prozesse machbar.

    Du könntest dein Script also z.B. teilen:


    gui.exe (nur für die Anzeige und zum Start der Unterprogramme da)
    worker.exe (führt deine zeitintensive Aktion durch und kommuniziert das Ergebnis an die GUI, falls notwendig)

    Die GUI arbeitet so unabhängig vom Rest und bleibt reaktionsfähig. Es ist außerdem möglich mehrere worker zu starten, welche dann alle paralell arbeiten.


    Eine andere Lösung wäre, dass zeitintensive Funktionen nebenher und regelmässig guigetmsg oder traygetmsg überprüfen (z.B. als Teil der Rechenschleife), allerdings werden die hinterlegten anderen GUI Funktionen trotzdem nicht paralell sondern bestenfalls verschachtelt abwechselnd ausgeführt. Das funktioniert außerdem nur dann wenn auf blockierende Funktionen wie sleep oder msgbox verzichtet wird. Um eine laufende Funktion abbrechen zu können wäre das jedenfalls eine gangbare Lösung.

  • If Abfrage aktiviert sich selbst

    • misterspeed
    • 31. Dezember 2013 um 09:58

    Naja nicht sonderlich überraschend.

    1. Wenn nichts angeklickt wird returned guigetmsg() immer 0
    2. Deine Funktion _GetFilesFolder_Rekursiv returned ein Array mit Dateipfaden

    Was passiert in deinem Code Abschnitt?

    [autoit]

    If $nMsg = $MenuSoundsItemSounds[$GetFolder[$i]][$GetFiles[$v]] Then

    [/autoit]


    $GetFolder[$i] = Ein Verzeichnis, z.B. "C:\test\"
    $GetFiles[$v] = Eine Datei des Verzeichnisses, z.B. "test.wav"

    3. Beides sind Strings, also für Autoit gleichbedeutend mit einer 0.

    Welchen Index von $MenuSoundsItemSounds sprichst du folglich immer an?

    [autoit]


    If $nMsg = $MenuSoundsItemSounds[0][0] Then

    [/autoit]

    Wenn nun der Inhalt des Arrays $MenuSoundsItemSounds an diesem Index einer 0 entspricht (Leer, String oder tatsächlich eine 0) ist die IF-Bedingung immer dann erfüllt wenn nichts angeklickt wurde. Somit ist sie permanent erfüllt außer du klickst wild rum.

    Das Ergebnis ist also so gut wie immer eine msgbox mit diesem Inhalt:

    [autoit]

    MsgBox (0, "", $GetFiles[$v])

    [/autoit]

    Warum ist $MenuSoundsItemSounds[0][0] in deinem Fall immer eine 0 ? Weil du das Array erst ab [1][1] mit MenuItem IDs befüllst. Ändert aber nichts daran, dass du vermutlich diesen Vergleich machen wolltest:

    [autoit]


    If $nMsg = $MenuSoundsItemSounds[$i][$v] Then

    [/autoit]
  • Automatisierte Installation / Updates

    • misterspeed
    • 30. Dezember 2013 um 14:28

    Dann deaktivere mal deinen Virenscanner oder verzichte auf die UPX Kompression beim compilen.

  • arraymore.au3 - Fehler?

    • misterspeed
    • 30. Dezember 2013 um 13:36
    Zitat von BugFix

    Also ich sehe den Button.

    Du bist auch Moderator und darfst auf geschlossene Threads antworten. Der Rest von uns darf dort leider nichts mehr posten :P

    Also walte deines Amtes und öffne den Thread wieder ^^

  • Installed Software

    • misterspeed
    • 29. Dezember 2013 um 23:21

    Die Funktion gibt nun ein 2D-Array mit allen gewünschten Daten zurück. Ich war außerdem mal so frei und habe alle Variablen lokal deklariert und einige andere Kleinigkeiten was die Reihenfolge und Übersicht anbelangt geändert.

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <array.au3>

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

    $aApp = ShowInstalledSoftware()
    _ArrayDisplay($aApp)

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

    func ShowInstalledSoftware()
    Local $count = 1, $all_keys = "", $abort = 0
    Local $Publisher, $UninstallString, $Version, $act_name, $act_key, $dontShow

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

    Local $main_key = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $main_key64 = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $key = $main_key

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

    Local $aReturn[1][4] = [["Programm","Hersteller","Version","Uninstall String"]]

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

    Do
    $act_key = RegEnumKey ($key, $count)
    If @error <> 0 then
    $abort += 1
    $count = 1
    $key = $main_key64
    Else
    $count = $count + 1

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

    $dontShow = RegRead($key & '\' & $act_key, "SystemComponent")
    If $dontShow = 1 Then ContinueLoop

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

    $act_name = RegRead($key & '\' & $act_key, "Displayname")
    if stringinstr($act_name,"Security Update") then continueloop
    if stringinstr($act_name,"Update for Microsoft") then continueloop
    if stringinstr($act_name,"Hotfix for") then continueloop
    if stringinstr($act_name,"Service Pack") then continueloop

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

    $act_name = StringReplace ($act_name, " (remove only)", "")

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

    If $act_name <> "" And Not StringInStr($all_keys,"|" & $act_name & "|") Then

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

    $all_keys = $all_keys & $act_name & "|"

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

    $Publisher = RegRead($key & '\' & $act_key, "Publisher")
    $Version = RegRead($key & '\' & $act_key, "DisplayVersion")
    $UninstallString = RegRead($key & '\' & $act_key, "UninstallString")

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

    If $Publisher = '' Then $Publisher = 'Unknown Publisher'
    If $Version = '' Then $Version = 'Unknown Version'
    If $UninstallString = '' Then $UninstallString = 'No Uninstaller found'

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

    ConsoleWrite("DEBUG: " & $act_name & ' ||| ' & $Publisher & ' ||| ' & $Version & ' ||| ' & $UninstallString & '~~~' & @CRLF)

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

    ReDim $aReturn[UBound($aReturn)+1][4] ; Array um eine Zeile vergrößern

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

    ; Einträge in die neue Zeile des Arrays machen
    $aReturn[UBound($aReturn)-1][0] = $act_name
    $aReturn[UBound($aReturn)-1][1] = $Publisher
    $aReturn[UBound($aReturn)-1][2] = $Version
    $aReturn[UBound($aReturn)-1][3] = $UninstallString

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

    Endif
    EndIf
    Until $abort = 2

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

    ConsoleWrite ("Einträge: " & UBound($aReturn)-1 & @CRLF)

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

    Return $aReturn
    EndFunc

    [/autoit]
  • Automatisierte Installation / Updates

    • misterspeed
    • 29. Dezember 2013 um 20:53
    Zitat von sklaim

    Wie kann ich das umsetzten, das man selbst im Programm andere Programme hinzufügen kann, ohne extra so eine Datei anlegen zu müssen?

    Naja irgendwo musst du diese Infos ja speichern, wenn sie beim nächsten Programmstart noch vorhanden sein sollen. Es liegt also nahe dafür eine ini Datei zu verwenden. Alternativ könnte man diese Dinge auch in der Registry speichern, was ich persönlich für unschöner halte, da die Daten so nicht mehr protabel und leicht editierbar sind. Ich sehe jedenfalls kein Argument gegen ein ini Datei solange die Daten nicht versteckt werden sollen, aber selbst das geht wunderbar mit einer ini Datei und den crypt Funktionen.

    Die ini aus dem Programm heraus zu erstellen ist ebenfalls kein Problem, falls das die eigentliche Frage war:

    • Du brauchst einen Button "Neues Programm hinzufügen"
    • Dieser Button fragt bei Klick z.B. per [autoit]inputbox()[/autoit] oder über ein separates Fenster mit Inputfeldern nach dem $Name, dem $Pfad und den $Parametern
    • Alle drei Informationen nutzt du dann mit
      [autoit]
      iniwrite("deine.ini",$Name,"setup",$Pfad)
      iniwrite("deine.ini",$Name,"parameter",$Parameter)
      [/autoit]
    • Fertig, deine ini sollte nun einen neuen Programm Eintrag haben
    • Anschließend solltest du den Inhalt des Dropdowns neu einlesen, damit das Programm sofort zur Auswahl verfügbar ist (siehe unten)


    Zitat von sklaim

    Und wie kriege ich es hin, das ich bei der Combo keine Einträge eingebe sondern ein Array, wobei jedes Feld für einen Eintrag steht?

    Indem du einfach deine ini einließt und das Dropdownmenü mit diesen Informationen fütterst

    [autoit]


    $Combo1 = GUICtrlCreateCombo("", 8, 8, 185, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL,$CBS_SORT))

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

    if fileexists("data.ini") then

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

    ; ini Datei einlesen
    $aProgramme = inireadsectionnames("data.ini")

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

    ; String für guictrlsetdata vorbereiten
    $sData = ""
    for $i = 1 to ubound($aProgramme)-1
    $sData &= $aProgramme[$i] & "|"
    next
    $sData = stringtrimright($sData,1)

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

    ; Combo mit Daten befüllen
    GUICtrlSetData($Combo1, $sData)

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

    EndIf

    [/autoit]


    Zitat von sklaim

    EDIT: Ich kriege die Datei auch nicht exportiert, denn es tritt folgender Fehler auf: "Error: Binary integrity can't be verified."
    Jemand eine Idee wie man das löst?

    Keine Ahnung wovon du redest. Ich sehe in deinem Quellcode keine Exportfunktion für irgendetwas. Wo und bei was erscheint der Fehler denn?

  • Fehlerabfrage bei COM Objekten

    • misterspeed
    • 29. Dezember 2013 um 20:13

    Ich kann dir zwar nicht mit Sicherheit sagen warum das so ist, aber ich denke mal die Funktion MyErrFunc() wird mehr oder weniger "zwischendrin" ausgeführt und danach der fehlerhafte COM Aufruf beendet. Da es zum Fehler kam wird @error scheinbar dann beim Abschließen der COM Aktion verändert.

    Einfachste Lösung: Verwende statt @error eine globale Variable die du im Code überprüfst bzw. in deiner Funktion MyErrFunc() veränderst.

  • Installed Software

    • misterspeed
    • 29. Dezember 2013 um 20:04

    Poste deinen Code bitte nochmal und verwende dabei den Quellcode Modus des Forums, damit deine Formatierung nicht verloren geht...


    [Blockierte Grafik: http://i.imgur.com/eKu4eMm.png]

  • Installed Software

    • misterspeed
    • 28. Dezember 2013 um 22:26

    Was genau?

    Die letzte Änderung liest zusätzlich noch den Schlüssel "SystemComponent" aus, welcher sich bei manchen Einträgen befindet. Meine Vermutung war, dass in der Systemsteuerung ausgeblendete Programme genau diesen Schlüssel mit dem Wert 1 besitzen, zumindestens ist bei mir soweit ich das beim groben Überfliegen gesehen habe keines der Programme sichtbar, welches diesen Schlüssel mit dem Wert 1 besitzt. Daher habe ich alle Einträge die diese Bedingung erfüllen mit continueloop übersprungen, genau wie ich es weiter oben bereits mit den Update/Hotfix Einträgen mache. In der Scite console lasse ich zur Kontrolle alle Einträge mit dem zugehörigen Schlüsselwert ausgeben, d.h. du könntest alle Zeilen die mit 1 beginnen mit der Systemsteuerung überprüfen um sicherzustellen, dass nicht zuviel übersprungen wird. Ich denke aber mal bei dir wird sich ebenfalls herausstellen, dass alle diese Einträge normalerweise ausgeblendet werden. Somit macht mein abgewandeltes Script vermutlich das gleiche wie die Routine der Systemsteuerung.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™