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

  • Binärdatei schreiben

    • misterspeed
    • 21. Juni 2013 um 16:46

    Und warum willst den Mist unbedingt in 4000 Zeichen Blöcke zerteilen?


    Geht 1A:

    [autoit]


    #include <array.au3>

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

    Local $hFile = Fileopen(@ScriptDir & "\test.exe", 16)
    Local $hread = FileRead($hFile)
    FileClose($hFile)

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

    ;MsgBox(0,"", $hread)
    ;Local $aRet = StringRegExp ( $hread, '(.{1,4000})', 3 ); nach 4000 Zeichen "auftrennen"
    ;_arraydisplay($aRet)

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

    Local $hExtrFile = FileOpen(@ScriptDir & "\test2.exe", 16+2)
    ;For $i = 0 To UBound($aret) -1
    FileWrite($hExtrFile, $hread);$aret[$i]); im ersten Durchgang schreib er 2000 Zeichen binär, danach in Text
    ;Next
    FileClose($hExtrFile)
    Exit

    [/autoit]
  • sqlite -> unterminated string

    • misterspeed
    • 21. Juni 2013 um 15:54

    Der Fehler liegt definitiv nicht in den geposteten Code Schnippseln. Poste das ganze Script und auch die ganze Fehlermeldung(en).

    Das Script hier funktioniert jedenfalls fehlerfrei und entspricht bis auf die ersetzten guictrlreads() deinem Script von oben. Selbst wenn das guictrlread scheitern sollte wäre syntaktisch noch alles ok und es würde eine Tabelle angezeigt werden.

    [autoit]


    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <array.au3>

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

    _SQLite_StartUp()
    $hDB = _SQLite_Open("xxx-DB.db")
    _SQLite_Exec ($hDB, "CREATE TABLE Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr);")
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) VALUES ( '" & _
    "name" & "','" & "Nummer" & "','" & "Strasze" & "','" & "Postleitzahl" & "','" & "Wohnort" & "','Pauschale','0');")

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

    ; show
    dim $aResult, $iRows, $iColumns
    $iRval = _SQLite_GetTable2d ($hDB, "SELECT * FROM Tabelle;", $aResult, $iRows, $iColumns)
    If $iRval = $SQLITE_OK Then _ArrayDisplay($aResult)

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

    _SQLite_Close($hDB)
    _SQLite_Shutdown()

    [/autoit]

    EDIT:

    Problematisch wird es aber evtl., wenn einfache Anführungszeichen, Kommas oder andere SQL Befehle in die Eingabefelder der GUI eingegeben werden. Das würde ich an deiner Stelle überdenken. ;)
    Die folgende Eingabe ins Feld Nummer würde z.B. die Tabelle löschen und eine neue Tabelle erzeugen:

    Code
    ','','','','','');DROP TABLE Tabelle;CREATE TABLE w00t('ich hab deine tabelle','gelöscht

    Daher sollte man Usereingaben niemals unkontrolliert in ein SQL Statement übernehmen.

  • Webseiten Blockieren bzw. auf html Dokument umleiten.

    • misterspeed
    • 21. Juni 2013 um 15:30

    Ich bezweifle ohnehin dass man es so machen kann. Soweit ich weiß kann in der HOSTS Datei eine manuelle URL->IP Zuordnung gemacht werden und nichts anderes. Wie kommst du darauf, du könntest dort einen Pfad zu einer lokalen HTML Datei angeben?

    Ein gültiger Eintrag wäre z.B. soetwas hier:

    Code
    127.0.0.1 autoit.de

    Das Resultat wäre die nicht Erreichbarkeit von autoit.de. Will man nun eine eigene Webseite anzeigen sobald jemand Autoit.de aufruft benötigt man auch einen Webserver, der auf Anfragen an localhost (127.0.0.1) antwortet. Ohne Webserver auf dem deine HTML Datei abrufbar ist wird dein Vorhaben jedenfalls nicht realisierbar sein.

  • Interaktion mit zwei Internet Explorer Fenstern

    • misterspeed
    • 21. Juni 2013 um 15:17

    Also mal 2 Sachen die mir auffallen:


    1. Du verwendest _IEAttach(). Wozu? Wenn ich mich recht an die IE Automatisierung erinnere wird bei IEAttach kein neues Fenster erzeugt, sondern ein weiterer Tab im IE geöffnet. Das macht schonmal in sofern Schwierigkeiten, weil die IE Funktionen keine Möglichkeit zum Tabwechsel bereitstellen. Du könntest auch einfach ein erneutes _IEcreate() verwenden und dir somit wirklich ein zweites unabhängiges Fenster erzeugen, welches du auch über einen anderen Variablennamen ansprechen kannst.

    2. Ich sehe in deinem Script ungewöhnliche viele send(), sleep() und window-Funktionen. Die Ausnahme bildet die erste Funktion, welche oberflächlich betrachtet durchdacht ist und weitmöglichst auf die IE Funktionen zugreift. Send() ist extrem unzuverlässig, selbst wenn man mit Blockinput manuelle Eingaben unterbindet. Die send Befehle können prinzipiell überall landen, da reicht es schon wenn ein anderes Fenster im falschen Moment den Focus bekommt. Außerdem muss man mit Sonderzeichen in Verbindung mit send() aufpassen. Ich rate jedenfalls davon ab. Die IE Funktionen bieten alles was man zur Webseiten automatisierung benötigt, ich sehe keinen Grund hier auf send() zurückzugreifen. Sofern damit aufpoppende Authentifizierungsfenster einer mit ".htaccess" geschützten Seite automatisiert werden sollen kann man das auch über eine entsprechend vorbereiteten URL nach dem Schema "user:pw@url" lösen.

  • Binärdatei schreiben

    • misterspeed
    • 21. Juni 2013 um 10:19

    Hast du dir das Beispiel in der Hilfe zu isbinary() angesehen?

    [autoit]


    Local $bBinary = Binary("0x00204060")
    Local $sString = "0x00204060"

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

    MsgBox(0, "IsBinary $bBinary", IsBinary($bBinary))
    MsgBox(0, "IsBinary $sString", IsBinary($sString))

    [/autoit]

    Autoit interpretiert es demzufolge nur dann als Binärstring, wenn es zuvor mit binary() als solcher "gecastet" wurde, andernfalls könnte durch den Variant Datentyp den Autoit verwendet eben auch mal der falsche Typ String verwendet werden. Ob das für filewrite überhaupt einen Unterschied macht und ob dort nicht ohnehin eine binäre Interpretation stattfindet wenn zuvor der binäre Schreibmodus durch fileopen erzwungen wurde weiß ich nicht. Es sollte aber auf jedenfall nicht schaden zuerst binary() auf den Quellstring anzuwenden.

  • Information ausgeben wenn neue Datei erstellt wird.

    • misterspeed
    • 20. Juni 2013 um 08:52

    Sofern man es nichtmal auf einen Ordner eingrenzen kann wäre das ziemlich ineffizient die komplette Festplatte durch Rekursive Dateisuche zu vergleichen. Auch die Überwachung von irgendwelchen Fenstern ist eher weniger zielführend, dazu gibt es vielzuviele Möglichkeiten wie eine Datei auf einer Festplatte landen kann, teilweise sogar ohne irgendwelche Fenster die man abfangen könnte. Ich empfehle daher einen Blick auf den Beitrag von Aspirinjunkie:

    https://autoit.de/index.php?page…7614#post267614

    Prinzipiell sollte es ausreichen die Switch Case Verzeweigung in EvaluateEvents() anzupassen, damit man nicht mehr über Dateiveränderungen sondern Dateierstellungen informiert wird. Außerdem natürlich die richtige Konstante verwenden um das zu überwachende Event mit RegisterFSEvent() zu registrieren.

  • Letzten 5 Prozesse

    • misterspeed
    • 18. Juni 2013 um 18:42

    Keine Ahnung was du nun genau willst. Ein Prozess wird nicht eingepflegt sondern ausgeführt oder auch nicht, aber dann ist es kein Prozess mehr, sonder einfach nur ein Stück binärer Datenmüll auf deiner Festplatte. Wenn du wissen willst wann die zugehörige exe eines laufenden Prozesses auf deiner Festplatte gespeichert wurde, dann lass dir von obigem WMI query die Dateipfade aller Prozesse geben und prüf mit FileGetTime das Erstelldatum der exe. Wobei letzteres nicht zwingend mit dem Datum zusammenhängt an dem es auf deine Festplatte kopiert wurde, da das Erstelldatum nicht zwingend geändert wird beim kopieren.

    Sofern das auch nicht weiterhilft kann man noch versuchen die Registry nach passenden (De)Installationseinträgen zu durchsuchen, was aber schwierig werden könnte, da nicht jeder laufende Prozess in der Registry verewigt wird noch eine zugehörige Installationsroutine besitzen muss.

    Wenns dir um Langzeitüberwachung geht kannst du auch einfach täglich ein Logfile erstellen/pflegen lassen, welches alle laufenden Prozesse auflistet und dieses dann ggf. auswerten um herauszufinden wann ein Prozess erstmalig aufgetaucht ist. Im nachhinein nützt das aber natürlich nichts mehr.

  • Letzten 5 Prozesse

    • misterspeed
    • 18. Juni 2013 um 09:00

    Mist da war jemand schneller. :D

    Hier meine Variante, allerdings ohne Umwandlung des Timecodes und Begrenzung auf die letzten 5, dafür aber mit Filter, der z.B. den eigenen Prozess und den wmi Dienst ausnimmt:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

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

    $aTest = getProcessCreationTimes()
    If IsArray($aTest) Then _ArrayDisplay($aTest)

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

    Func getProcessCreationTimes($strComputer = '.')
    Local $aReturn[1][4] = [["Name","PID","Date","Pfad"]]
    Local $x = 0
    Local $objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_process')
    If Not IsObj($colItems) Then Return SetError(2, 0, 0)

    For $objItem In $colItems

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

    ; einige Ausnahmen, die nicht mit angezeigt werden sollen:
    Local $name = $objItem.Name
    If StringInStr($name,"autoit") Then ContinueLoop
    If StringInStr($name,"WmiPrvSE") Then ContinueLoop
    If StringInStr($name,"scite") Then ContinueLoop
    If StringInStr($name,@ScriptName) Then ContinueLoop

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

    $x += 1
    ReDim $aReturn[$x + 1][4]
    $aReturn[$x][0]=$objItem.Name
    $aReturn[$x][1]=$objItem.ProcessID
    $aReturn[$x][2]=$objItem.CreationDate
    $aReturn[$x][3]=$objItem.ExecutablePath
    Next

    _ArraySort($aReturn,1,1,0,2) ; sortiert absteigend nach Erstelldatum
    Return $aReturn
    EndFunc

    [/autoit]
  • Array variable subscript badly formatted.

    • misterspeed
    • 18. Juni 2013 um 08:11
    Zitat von Kleiner

    wie hast du dein Array Dimensioniert???

    Da er behauptet 8x8 wohl eher so:

    [autoit]

    Local $aTmp[8][8]

    [/autoit]

    Wie dem auch sei, schau einfach wie Kleiner schon sagte mit arraydisplay nach wie das Array ausschaut bevor du die For Schleife abarbeitest. Vermutlich stimmen deine array Dimensionen nicht oder nicht mehr, weil du dir das array in einem nicht geposteten Code Teil überschreibst oder neu dimensionierst.

    [autoit]


    if not isArray($4GewPicsDatei) then
    msgbox(0,"Fehler","$4GewPicsDatei ist kein Array!")
    else
    ;MsgBox (0,"",$4GewPicsDatei[0][0])
    _arraydisplay($4GewPicsDatei)
    For $i = 0 To 4
    For $x = 0 To 4
    Select
    Case $4GewPicsDatei[$i][$x] = $4GewRedYellow And $4GewPicsDatei[$i+1][$x+1] = $4GewRedYellow And $4GewPicsDatei[$i+2][$x+2] = $4GewRedYellow And _
    $4GewPicsDatei[$i+3[$x+3] = $4GewRedYellow
    ;???????????????????????????????????? wo ist der code der in diesem case Zweig ausgeführt wird ??????????????????
    EndSelect
    Next
    Next
    endif

    [/autoit]
  • DllCall GUI - rückgängig

    • misterspeed
    • 16. Juni 2013 um 17:14

    Hier mal zur Veranschaulichung was die DLL calls tun und was nicht:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $soft = 0

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

    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    GUISetBkColor(0xE0FFFF,$Form1)
    $TTTCompStart = GUICtrlCreateButton("Computergegner:", 30, 190, 180, 60, 14, -1)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $TTTCompStart
    Switch $soft
    Case 0
    $soft = 1
    DllCall("user32.dll", "UINT", "SendMessage", "handle", GUICtrlGetHandle($TTTCompStart), "UINT", $BCM_SETSHIELD, "ptr*", 0, "BOOL", True)
    Case 1
    $soft = 2
    DllCall("user32.dll", "UINT", "SendMessage", "handle", GUICtrlGetHandle($TTTCompStart), "UINT", $BCM_SETSHIELD, "ptr*", 0, "BOOL", False)
    Case 2
    $soft = 3
    DllCall("user32.dll", "UINT", "SendMessage", "handle", GUICtrlGetHandle($TTTCompStart), "UINT", $BCM_SETNOTE, "ptr*", 0, "wstr","Start")
    Case 3
    $soft = 4
    DllCall("user32.dll", "UINT", "SendMessage", "handle", GUICtrlGetHandle($TTTCompStart), "UINT", $BCM_SETNOTE, "ptr*", 0, "wstr","")
    Case 4
    $soft = 5
    GUICtrlSetStyle($TTTCompStart, $GUI_SS_DEFAULT_BUTTON)
    Case 5
    $soft = 0
    GUICtrlSetStyle($TTTCompStart, 14)
    EndSwitch
    EndSwitch
    WinSetTitle($Form1,"","Case: " & $soft)
    WEnd

    [/autoit]
  • Problem mit Array und SetError

    • misterspeed
    • 15. Juni 2013 um 21:57

    Öhm keine Ahnung in welcher Sprache du programmierst, aber es wimmelt vor Syntax Fehler, die dir Scite auch alle bemängeln sollte wenn du den Syntax Check ausführst.

    [autoit]


    If
    IsArray($test) = 1 Then ConsoleWrite(IsArray($test) &
    '$test["hGui"] = ' & $test['hGui'] & '$test["SLNumber"] = '
    & $test['SLNumber'] & @CRLF)

    [/autoit]

    Selbstverständlich falsch, da nach IF nie eine neue Zeile folgt, sondern erstmal die Bedingung und dann ein THEN. Wenn du lange Zeilen über mehrere verteilt im Quellcode darstellen willst ist ein Unterstrich zu verwenden, also z.b. so:

    [autoit]


    $test = "ein super langer text.... " & _
    "blablabla...." & _
    " textende"

    [/autoit]

    Da das extrem oft in deinem Code vorkommt, vermute ich aber fast, dass du nur hier beim Posten Probleme hattest und die Zeilenumbrüche von Hand einfügen musstest. Verwende lieber einen gescheiten Browser bzw. den Quellcode Editor um Postings abzusenden.

    Nun zum eigentlich wirklichen Syntax Problem, welches dir auch Scite nicht melden wird, weil es syntaktisch zufälligerweise korrekt ist, aber sicher nicht das macht was du wolltest:

    [autoit]


    Dim $Array[100] = [100, 'hGui', 'GuiName', 'hPinsel1', 'hPinsel2', 'SLNumber']
    ;Dim $Array[100] = [100, 'hGui', 'GuiName', 'hGraphic', 'hPinsel2']
    $Array['GuiName'] = "RahmenGui"

    [/autoit]

    In Autoit wie auch den meisten anderen Sprachen kann man Arrays nur per ganzzahligem Index und nicht per String/Name verwalten. Strings haben also nichts in den eckigen Klammern verloren (Ausnahme die Deklaration der Feldinhalte). Die erste Zeile ist so wie sie ist also korrekt, du deklarierst ein Array mit 100 Zeilen und gibst den ersten 5 Array Zeilen jeweils einen Wert. Deine Code Zeile 3 ist hingegen falsch, da du hier den Index 2 angeben müsstest um die Array Zeile 3 mit dem Inhalt "GuiName" durch "RahmenGUI" zu ersetzen. Richtig wäre es also so:

    [autoit]


    $Array[2] = "RahmenGui"

    [/autoit]

    Dein Array würde danach so ausschaun:

    Code
    100
    'hGui'
    "RahmenGui"
    'hGraphic'
    'hPinsel2'
    *****95 leere Zeilen*****

    Dieser Fehler zieht sich durchs komplette Script. Der einzige Grund warum der Syntax Check es nicht bemängelt ist die automatische Typumwandlung von Autoit, welche aus deinem String in den eckigen Klammern eine Zahl macht. Ein String wird hierbei immer zu einer 0 umgewandelt. Du änderst bzw liest also nicht die gewünschte Zeile des Arrays, sondern immer den Wert von Zeile 0.

    Im Moment schaut dein Array also eher so aus:

    Code
    "RahmenGui"
    'hGui'
    'GuiName'
    'hGraphic'
    'hPinsel2'
    *****95 leere Zeilen*****
  • Autoit Programm verkaufen?

    • misterspeed
    • 15. Juni 2013 um 21:03

    Jupp so ist es. Gewerbsmässiges Handeln muss nicht zwingend gegeben sein, man kann auch völlig ohne Gewerbe eine Rechnung als Privatperson ausstellen. Habe ich selbst schon gemacht, weil die betreffende Firma natürlich ihre Ausgaben entsprechend nachweisen musste. Dabei ging es um die Bereitstellung meines Autos für einen Filmdreh.

    Ein Gewerbe hätte ich dafür nur anmelden müssen, wenn ich das regelmässig tun würde oder eben wie schon erwähnt wurde gewisse finanzielle Grenzen überschreite. Ansonsten müsste auch jede Privatperson die ab und an Gegenstände bei Ebay vertickt ein Gewerbe anmelden, was natürlich ein völlig überzogener bürokratischer Akt wäre.

    Die Grenze für private Einnahmen die auch nicht dem Finanzamt gemeldet werden müssen liegt aber soweit ich mich erinnere deutlich unter den genannten 34k Euro (sind denke ich 5-10k €). 32k Euro dürfte eher die Grenze sein bis zu der die Kleinunternehmer Regelung greift, also ein Unternehmer von der Umsatzsteuerpflicht befreit ist. Aber dafür muss man definitiv ein Gewerbe anmelden und z.B. Gewerbesteuern abführen.

    Sofern die Schule nicht tausende Lizenzen kauft und einen Wartungsvertrag mit dir schließt, welcher ggf. weitere regelmäßige Einnahmen bedeuten würde, könnte das also durchaus noch ohne Gewerbe machbar sein. Aber wenn du schon mit dem Gedanken spielst solltest du natürlich auch vorher abklären ob die Schule überhaupt Interesse daran hat eine Software von dir zu kaufen und wenn ja welche Anforderungen und Bedingungen von deiner Seite erfüllt werden müssen.

  • SQLite Trigger / Commit wird nicht erzeugt?

    • misterspeed
    • 14. Juni 2013 um 14:41

    Foreign Key Support muss erst aktiviert werden. Hiermit kannst du prüfen ob das bereits der Fall ist, wenn nicht die beiden auskommentierten Zeilen einkommentieren.

    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>

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

    Global $hQuery, $aRow

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

    _SQLite_Startup()

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

    _SQLite_Open(**************deineDB**************)

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

    ;_SQlite_Query(-1, "PRAGMA foreign_keys = ON;", $hQuery) ; aktiviert ForeignKey support, siehe doku
    ;_SQLite_QueryFinalize($hQuery)

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

    _SQlite_Query(-1, "PRAGMA foreign_keys;", $hQuery) ; DEBUG: prüft ob ForeignKey aktiviert ist, 0=disabled, 1=enabled
    While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
    _ArrayDisplay($aRow)
    WEnd
    _SQLite_QueryFinalize($hQuery)

    [/autoit]
  • ISN AutoIt Studio

    • misterspeed
    • 12. Juni 2013 um 21:17

    Ahja da ich heut drüber gestolpert bin...

    Es wäre genial, wenn du auch Ribbon Menü Support in dein Form Studio packen könntest.

    http://www.autoitscript.com/forum/topic/128242-ribbon/
    https://autoit.de/index.php?page=Thread&amp;threadID=12698

    Bei der etwas frischeren Variante aus dem englischen Forum verstehe ich aber ehrlich gesagt nicht so recht was da passiert, scheint auch nicht wirklich UDF like aufgebaut zu sein, vermutlich steckt das meiste in der dll. die Variante von "chrisatack" dürfte sich hingegen eher eignen um es ins Form Studio zu implementieren. Wenn du mal viel Langeweile hast kannst es dir ja mal ansehen, ich habs mir bislang nur oberflächlich angeschaut. Wäre jedenfalls ein nettes Feature.

    EDIT:
    Seh ich das richtig, dass das Form Studio nichtmal ganz normale Dateimenüs unterstützt?

  • DllCall GUIDesign

    • misterspeed
    • 12. Juni 2013 um 16:18

    Bug-Fix hat dazu ein Tutorial verfasst, allerdings geht er da denke ich weniger auf msdn ein, sondern mehr auf die Anwendung in Autoit, habs aber selbst auch nur überflogen:

    http://bug-fix.info/dll/dll_tut.html

  • IE Login Formular ausfüllen

    • misterspeed
    • 12. Juni 2013 um 13:30

    Beschäftige dich lieber mit der bereitgestellten API, statt das ganze per Browser Automatisierung zu versuchen: http://www.mysms.com/de/developer

    Aber davon mal ab... warum unbedingt über diesen Dienst? Heute hat doch so ziemlich jeder ein Smartphone und sollte problemlos Emails empfangen können. Der Sinn von SMS oder anderen Message App's erschließt sich mir daher schon ne Weile nicht mehr. In Emails könntest du bei Bedarf sogar Bilder unterbringen, die den Fehler veranschaulichen oder weitere Informationen liefern.

    Daher vielleicht auch das hier ein Blick wert?

    [autoit]

    _INetSmtpMail

    [/autoit]
  • FileOpenDialog öffnet Datei nicht

    • misterspeed
    • 10. Juni 2013 um 22:43

    Naja was soll sich auch öffnen. Es wurde doch bereits gesagt, dass ein FileOpenDialog keine Dateien öffnet, sondern lediglich den Pfad der gewählten Datei zurückgibt. Was du mit dem Pfad dann anstellst ist dir überlassen, ich empfehle in deinem Fall mal die Nutzung von

    [autoit]

    shellexecute("pfad_von_file_open")

    [/autoit]
  • Performance von SQLite optimieren?

    • misterspeed
    • 10. Juni 2013 um 20:40
    Zitat von misterspeed

    Könnte man eine Zeilenverkettung auch mit einem verschachtelten Select hinbekommen? Die Frage wäre aber auch ob der Zeitgewinn durch die Reduzierung der dll calls letztlich nicht wieder durch das Stringsplit in Autoit aufgefressen wird...


    Ha!

    Ich beantworte meine Frage mal selbst, da es mir einfach keine Ruhe gelassen hat. Ja man kann es auch über ein geschachteltes Select hinbekommen und nein Stringsplit kostet sogut wie garkeine Zeit. Das Ergebnis ist nun eine Methode, die wie oben skizziert die komplette Tabelle per Spalten und Zeilen Verkettung in ein einziges Tabellenfeld packt. Und ja auch wenn das ziemlich wirr klingt, es ist nun genauso schnell wie die CSV Methode, also nochmals doppelt so schnell wie die Variante, bei der nur die Spalten verktettet wurden.

    Einen Haken hat das ganze aber noch, denn die Performance bricht ab einer gewissen Datenmenge massivst ein und ist dann sogar schlechter als beim reinen Spalten verketten. Das scheint primär daran zu liegen, dass das Fetch des großen Pakets ab diesem Punkt scheinbar länger als die vielen kleinen Fetches braucht.

    Bei den Testdaten fällt das erst ab 8000-9000 Zeilen wirklich ins Gewicht. Die CSV Methode skaliert somit immernoch am besten mit ansteigender Zeilenzahl.

    [autoit]


    ; Daten einlesen
    Local $subquery="SELECT " & StringReplace($allColumNames,"|"," || '|' || ") & " AS Result FROM " & $tablename
    _SQLite_Query ( $hDB, "Select group_concat(Result) FROM (" & $subquery & ")", $hQuery )
    _GUICtrlListView_BeginUpdate($myList)
    If _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK Then
    Local $aTemp = StringSplit($aResult[0],",")
    For $i = 1 To $aTemp[0]
    GUICtrlCreateListViewItem($aTemp[$i],$myList)
    Next
    Else
    ConsoleWrite("SQLite Error: Reading Table failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    EndIf
    _SQLite_QueryFinalize($hQuery)
    _GUICtrlListView_EndUpdate($myList)

    [/autoit]
    Code
    CSV-Methode Time: 302.280300585426
    SQL-LWjoinFast-Methode Time: 323.844537573561
    SQL-LWjoin-Methode Time: 597.191229577753
    SQL-Fetch-Methode Time: 1017.78813832817
    SQL-2DArray_LWArrAdd-Methode Time: 1157.89243714743
    SQL-2DArray-Methode Time: 1265.99571796851
  • Performance von SQLite optimieren?

    • misterspeed
    • 10. Juni 2013 um 17:59
    Zitat von TheLuBu

    nicht funktioniert.
    1. Es gibt es keine Stored Funktions / Stored Procedures bei SQlite (http://www.sqlite.org/whentouse.html)
    2. Datenbanken arbeiten Datensatzweise, der Datensatz in der ersten Zeile hat nichts mit dem Datensatz in der 2ten Zeile zu tun, eine Verknüpfung ist also nicht möglich


    1. hab ich ja selbst schon festgestellt gehabt, was 2. angeht:

    Soweit ich mich recht an die Cursor Beispiele bzgl. Stored Function in Oracle erinnere sollte das durchaus gehen. Du kannst in PL/SQL genau wie in Java/Autoit ein resultset/Cursor für das SQL Query deklarieren und diesen dann in einer Schleife nach dem Query Zeilenweise auslesen. In dieser Schleife sollte dann wie in Java/Autoit auch eine Stringverkettung mit einer zuvor deklarierten Rückgabevariable möglich sein. Theoretisch müsste es also schon gehen Zeilen zu verketten.

    Hier wird das sogar gemacht, wenn auch nur eine Addition und keine Stringverkettung: http://www.datenbank-plsql.de/sql.htm

    Vorteil des ganzen ist eben, dass das Query komplett DB intern verarbeitet wird und erst danach ein Ergebnis nach außen geliefert werden muss, was wohl deutlich performanter sein dürfte. Aber auch egal denn sqlite kann das ja leider nicht in dieser Form.

  • Probleme mit RunAs

    • misterspeed
    • 10. Juni 2013 um 15:45

    Ich zitiere mal die Anmerkungen der Hilfe zu runas(). Da gibt es wohl etliche Dinge zu beachten und da das Problem dir zu Folge nicht auf allen Systemen auftritt würde ich die Liste hier mal abarbeiten und prüfen ob auf den jeweiligen Systemen evtl. eine oder mehrere der problematischen Punkte erfüllt sind.


    Zitat


    Remarks

    Paths with spaces need to be enclosed in quotation marks.

    It is important to specify a working directory the user you are running as has access to, otherwise the function will fail.

    It is recommended that you only load the user's profile is you are sure you need it. There is a small chance a profile can be stuck in memory under the right conditions. If a script using RunAs() happens to be running as the SYSTEM account (for example, if the script is running as a service) and the user's profile is loaded, then you must take care that the script remains running until the child process closes.

    When running as an administrator, the Secondary Logon (RunAs) service must be enabled or this function will fail. This does not apply when running as the SYSTEM account.

    After running the requested program the script continues. To pause execution of the script until the spawned program has finished use the RunAsWait function instead.

    Providing the Standard I/O parameter with the proper values permits interaction with the child process through the StderrRead, StdinWrite and StdoutRead functions. Combine the flag values (or use $STDERR_CHILD, $STDIN_CHILD & $STDOUT_CHILD, defined in Constants.au3) to manage more than one stream.

    In order for the streams to close, the following conditions must be met: 1) The child process has closed it's end of the stream (this happens when the child closes). 2) AutoIt must read any captured streams until there is no more data. 3) If STDIN is provided for the child, StdinWrite() must be called to close the stream. Once all streams are detected as no longer needed, all internal resources will automatically be freed.
    StdioClose can be used to force the STDIO streams closed.

    The "load profile" and "network credentials only" options are incompatible. Using both will produce undefined results.

    There is an issue in the Windows XP generation of Windows which prevents STDIO redirection and the show flag from working. See Microsoft Knowledge Base article KB818858 for more information about which versions are affected as well as a hotfix for the issue. User's running Windows 2000, Windows XP SP2 or later, or Windows Vista are not affected.

    Alles anzeigen

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™