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. alpines

Beiträge von alpines

  • Betatest PassIt2 (Datenübertragung zwischen PCs) - Abgeschlossen - VIELEN DANK

    • alpines
    • 16. Mai 2019 um 17:12
    Zitat von Bitnugger

    habe aber erst ab nächste Woche Zeit dafür

    Das ist kein Problem, jeder kann sich die Zeit nehmen die er braucht (und auch wie ausführlich er das machen möchte).

    Wenn du die Zeit findest kannst du gerne nochmal bescheid geben oder ich füge dich jetzt in die Gruppe hin (wenn du das überhaupt möchtest).

    Wenn man als Teilnehmer hinzugefügt wird kann man auch die vorherigen Nachrichten lesen (auswählbar), also darum musst du dir keine Sorgen machen.

  • ControlSend an DOSBox

    • alpines
    • 16. Mai 2019 um 10:55
    Zitat von Musashi

    Möglich, ggf. aber auch nur bis XP :/ . Bei Win 7 64-Bit meldet Run jedenfalls

    Zitat von alpines

    Ich glaub mich dunkel daran zu erinnern, dass 16-Bit Anwendungen auf 32-Bit Windows unterstützt werden, allerdings auf 64-Bit nicht.

    Hab ich was bei deinem Post übersehen oder hast du dich bei meinem verlesen?

    Der Klarheit halber:

    32-Bit + 16-Bit OK,

    64-Bit + 16 Bit nur mit NTVDM (>Win10 ?).

  • ControlSend an DOSBox

    • alpines
    • 16. Mai 2019 um 10:31
    Zitat von Musashi

    Im Prinzip hast Du natürlich völlig recht !

    Hier scheint es sich aber um eine Uralt-DOS.EXE (16-Bit) zu handeln, die man mit Run nicht ausführen kann ! Ich kenne das von alten DOS-Spielen aus den 1990ern. Auch dort muss man den Umweg über einen DOS-Emulator (hier also DOSBox) gehen.

    Ich glaub mich dunkel daran zu erinnern, dass 16-Bit Anwendungen auf 32-Bit Windows unterstützt werden, allerdings auf 64-Bit nicht.

    Allerdings gibt es für Windows 10 x64 was das nennt sich NTVDM: https://www.groovypost.com/howto/enable-1…ort-windows-10/

  • Betatest PassIt2 (Datenübertragung zwischen PCs) - Abgeschlossen - VIELEN DANK

    • alpines
    • 15. Mai 2019 um 22:53

    Da mir die SB ein wenig zu flüchtig ist wollte ich einen Thread erstellen um auf einen gerade laufenden "Betatest" aufmerksam zu machen.

    Ich wollte demnächst ein selbstprogrammiertes Projekt hier vorstellen und möchte mir vorher gerne anhören was andere davon halten.

    Das gesamte Projekt (GUIs, Design, Code) (bis auf eine UDF) habe ich selbstgemacht und sicherlich kann man da noch einiges verbessern.

    Sei es die Anordnung der Elemente auf einer GUI, oder Funktionalitäten die fehlen.

    Getestet wird "PassIt2" welches genutzt werden soll um Daten zwischen PCs im lokalen Netzwerk (oder auch global) zu übertragen.

    Das Programm hat einige Features welche in der Betabeschreibung, im Skript oder in der Hilfe erläutert sind.

    Wenn jemand Interesse hat und sich das gerne mal anschauen und seinen Senf dazu geben möchte (sei es in ein paar Zeilen oder in einer ausführlichen Dokumentation) dann schicke ich euch gerne das Programm zu.
    Niemand ist gezwungen mehrere Seiten zu verfassen und alle Punkte abzuarbeiten welche in der mitgelieferten Beta.pdf erwähnt werden, die soll nur als Leitfaden dienen.


    Es gibt eine private Konversationsgruppe in der die Dateien vorhanden sind und Bugs, Features, ... gepostet und diskutiert werden kann.

    Sollte jemand das ganze testen wollen aber mir nur privat das ganze mitteilen (aus welchen Gründen auch immer) kann ich natürlich auch eine private Konversation starten - das ist kein Problem.

    Screenshots (klicken zum vergrößern)

    pasted-from-clipboard.pngpasted-from-clipboard.pngpasted-from-clipboard.pngpasted-from-clipboard.png

    Wenn ihr also Interesse habt könnt ihr hier im Thread antworten oder eine private Nachricht schicken (und ob ihr in die Gruppe wollt).

    Das Programm gibts ausschließlich per PN.

    Ich freue mich auf jeden Teilnehmer und auf jedes konstruktive Feedback.

    Eine direkte Entlohnung gibt es nicht, aber ich hab da was im Hinterkopf ;)

    Das Programm kann auch auf einem Rechner laufen, dann schickt man halt die Daten vom PC wieder an den selben PC, man braucht also nicht zwangsweise zwei Geräte (auch wenn das natürlich später so Anwendung finden soll).

    Dieser Thread dient NICHT zur Besprechung von Features, Bugs oder ähnlichem.

    aktueller Teilnehmerstand: 7 (+2 nicht aus dem Forum)

  • ControlSend an DOSBox

    • alpines
    • 15. Mai 2019 um 16:15

    Ganz blöde Frage, was willst du denn ins DosBox machen, dass du dort Befehle absetzen musst?

  • Funktionsname inkl. Parameter mit RegEx filtern

    • alpines
    • 15. Mai 2019 um 08:59
    Zitat von chesstiger

    Das Pattern ist korrekt. Ich nutze zur "Entwicklung" von regulären Ausdrücken fast immer regex101.com.

    Sehr zu empfelen, nutze ich nämlich auch ;)

    Es lies mir gestern Abend schlicht keine Ruhe und ich habe mit allen Mitteln und Wegen versucht dein Pattern kaputtzukriegen und habs letzendlich auch geschafft.

    Und ja, es handelt sich um eine gültige Funktionsdeklaration!!! :rofl:

    Einfach auf mehrere Zeilen unterteilen und Kommentare reinhauen die das Nesting kaputtmachen :)

    Beim 1. Beispiel crasht dein Pattern (wenn man hinter der letzten Kommentarklammer noch etwas hinzufügt), und beim 2. gibt er den Kommentar am Ende mit aus.

    Du kannst die Funktionen auch gerne testen, sie funktionieren einwandfrei wenn man sie normal callt.

    Edit: Es geht auch einfacher, einfach Klammern unbalancen (Beispiel 3).

    Edit2: Und noch einfacher gehts (dazu werde ich jetzt kein Beispiel posten), wenn ich einfach ein Leerzeichen vor dem Func setze, aber das ist sehr einfach fixbar.

    1. Beispiel
    Code
    Func Bla( $a, _ ; " (
     $b) ; blubb) a
    
    
    EndFunc
    Code
    #include <StringConstants.au3>
    
    _Strip(0, "Func Bla( $a, _ ; "" (" & @CRLF & "$b) ; blubb) a")
    
    Func _Strip($iNum, $sData)
        Local $sRxPattern = '^Func\h*(\w+\h*(\((((''|")((((?!\5).)*)|(?4))*\5)|([^()]*)|(?2))*\)))\h*(;.*)?\h*\R*$'
    
        ConsoleWrite("- " & $iNum & @TAB & "ConsoleWrite    : '" & $sData & "'" & @CRLF)
    
        $sStrip = StringRegExpReplace($sData, $sRxPattern, '\1')
        $sStrip = @extended ? $sStrip : 'RegEx-Error!'
        ConsoleWrite((@extended ? "- " : "! ") & $iNum & @TAB & "StringRegExpReplace : '" & $sStrip & "'" & @CRLF)
    
        $aRX = StringRegExp($sData, $sRxPattern, $STR_REGEXPARRAYMATCH) ; mit Parameter
        $sStrip = @error ? 'RegEx-Error!' : $aRX[0]
        ConsoleWrite((@error ? "! " : "> ") & $iNum & @TAB & "StringRegExp        : '" & $sStrip & "'" & @CRLF)
    EndFunc
    
    Func Bla( $a, _ ; " (
     $b) ; blubb) a
    
    
    EndFunc
    Alles anzeigen
    2. Beispiel
    Code
    Func Bla( $a, _ ; " (
     $b) ; blubb)
    
    
    EndFunc
    Code
    #include <StringConstants.au3>
    
    _Strip(0, "Func Bla( $a, _ ; "" (" & @CRLF & "$b) ; blubb)")
    
    Func _Strip($iNum, $sData)
        Local $sRxPattern = '^Func\h*(\w+\h*(\((((''|")((((?!\5).)*)|(?4))*\5)|([^()]*)|(?2))*\)))\h*(;.*)?\h*\R*$'
    
        ConsoleWrite("- " & $iNum & @TAB & "ConsoleWrite    : '" & $sData & "'" & @CRLF)
    
        $sStrip = StringRegExpReplace($sData, $sRxPattern, '\1')
        $sStrip = @extended ? $sStrip : 'RegEx-Error!'
        ConsoleWrite((@extended ? "- " : "! ") & $iNum & @TAB & "StringRegExpReplace : '" & $sStrip & "'" & @CRLF)
    
        $aRX = StringRegExp($sData, $sRxPattern, $STR_REGEXPARRAYMATCH) ; mit Parameter
        $sStrip = @error ? 'RegEx-Error!' : $aRX[0]
        ConsoleWrite((@error ? "! " : "> ") & $iNum & @TAB & "StringRegExp        : '" & $sStrip & "'" & @CRLF)
    EndFunc
    
    Func Bla( $a, _ ; " (
     $b) ; blubb)
    
    
    EndFunc
    Alles anzeigen
    3. Beispiel
    Code
    #include <StringConstants.au3>
    
    _Strip(0, "Func Bla( $a = ""'Hallo ("" ) ; lol)")
    
    Func _Strip($iNum, $sData)
        Local $sRxPattern = '^Func\h*(\w+\h*(\((((''|")((((?!\5).)*)|(?4))*\5)|([^()]*)|(?2))*\)))\h*(;.*)?\h*\R*$'
    
        ConsoleWrite("- " & $iNum & @TAB & "ConsoleWrite    : '" & $sData & "'" & @CRLF)
    
        $sStrip = StringRegExpReplace($sData, $sRxPattern, '\1')
        $sStrip = @extended ? $sStrip : 'RegEx-Error!'
        ConsoleWrite((@extended ? "- " : "! ") & $iNum & @TAB & "StringRegExpReplace : '" & $sStrip & "'" & @CRLF)
    
        $aRX = StringRegExp($sData, $sRxPattern, $STR_REGEXPARRAYMATCH) ; mit Parameter
        $sStrip = @error ? 'RegEx-Error!' : $aRX[0]
        ConsoleWrite((@error ? "! " : "> ") & $iNum & @TAB & "StringRegExp        : '" & $sStrip & "'" & @CRLF)
    EndFunc
    Alles anzeigen
  • Funktionsname inkl. Parameter mit RegEx filtern

    • alpines
    • 15. Mai 2019 um 01:26

    Dein Pattern kann doch so nicht funktionieren, du hast ein Apostroph und Gänsefüßchen drin, d.h. der String terminiert auf jeden Fall.

    Vielleicht wurde ja was vom Forum verschluckt, poste doch mal auf pastebin und verlink hier her.

  • Funktionsname inkl. Parameter mit RegEx filtern

    • alpines
    • 15. Mai 2019 um 00:46

    Schönes Pattern :thumbup:, hätte nicht gedacht, dass man das damit hinbekommt, aber meine Regex-Künste sind da auch sehr bescheiden.

    Sobald man unausgeglichene Klammern hat kommts leider ins Stolpern, möchte man einen 100% sicheren Parser haben dann führt glaube ich der Weg an einem nicht-regex Parser nicht vorbei.

    Dass \s auch vertikale matcht hatte ich ehrlich gesagt nie auf dem Schirm, da ich immer (wenn ich einen Zeilenumbruch hatte) automatisch \R gesetzt habe.

    Gut zu wissen, dass es auch \h gibt, dann werde ich das von nun an auch verwenden.

  • Funktionsname inkl. Parameter mit RegEx filtern

    • alpines
    • 14. Mai 2019 um 23:09

    Ich glaub nicht, dass du das in jedem Fall mit Regex alleine hinbekommst weil du Nesting (von selben Zeichen bzw. von der selben Gruppe) hast.

    Das selbe Problem hatte ich, als ich mir einen XML-Parser geschrieben hatte. Sobald gleiche Strukturen ineinander liegen kannst du sie mit Regex, nach meinem derzeitigen Wissensstand, nicht erkennen.

    Bei meinem Problem hatte ich Regex dort genutzt wo kein Nesting auftrat, und dort wo es Probleme machte, habe ich einen eigenen Parser geschrieben.

    Dieser hatte immer Kenntnis darüber wie viele Tags (welche nesten) auf und zu gingen (bin Tag für Tag durch den Code gegangen mit StringInStr, etc...) um den richtigen Bereich zu parsen.

    Ich schätze mal du brauchst sowas auch.

    Setzt du allerdings als kein Nesting als Prämisse voraus solltest du ein Pattern hinbekommen.

    Dein Pattern ist schon mal nicht schlecht aber du hast ein paar Sachen übersehen.

    Das (?:\R+)? am Ende steht in der Klammer drin, aber das willst du ja nicht catchen, also musst du es hinter die letzte Klammer schieben, du kannst es sowieso durch ein \R* ersetzen (Erklärung weiter unten).

    Deine Klammer-auf am Anfang ist falsch, du escapest Klammer-zu, du hast wohl das falsche Zeichen genommen. Also statt \) \( nehmen (beim Func\s(.*\)).

    Außerdem hast du vieles ziemlich umständlich beschrieben, z.B. das don't-catch possible existing whitespace mit (?:\s+)?.

    Nimm doch direkt \s* das matcht 0...unendlich und catcht nicht.

    Ohne Nesting kann man dein Pattern bisschen anpassen und es funktioniert.

    Das ist bestimmt ziemlich scheusslich, aber zu so später Stund krieg ichs nicht besser hin.

    Code
    #include <StringConstants.au3>
    
    _Strip(1, 'Func _SciTE_ShowFuncName()')
    _Strip(2, 'Func _SciTE_ShowFuncName ( ) ')
    _Strip(3, 'Func _SciTE_ShowFuncName (";");')
    _Strip(4, 'Func _SciTE_ShowFuncName (";"); ')
    _Strip(5, 'Func _SciTE_ShowFuncName (";") ; ')
    _Strip(6, 'Func _SciTE_ShowFuncName()' & @CRLF)
    _Strip(7, 'Func _SciTE_ShowFuncName(1)' & @CRLF)
    
    Func _Strip($iNum, $sData)
        Local $sRxPattern = '^Func\s(.*\(\s*(?:;)?.*\))\s*;?\s*\R*$'
    
        $sStrip = StringRegExpReplace($sData, $sRxPattern, '\1')
        $sStrip = @extended ? $sStrip : 'RegEx-Error!'
        ConsoleWrite((@extended ? "- " : "! ") & $iNum & @TAB & "StringRegExpReplace : '" & $sStrip & "'" & @CRLF)
    
        $aRX = StringRegExp($sData, $sRxPattern, $STR_REGEXPARRAYMATCH) ; mit Parameter
        $sStrip = @error ? 'RegEx-Error!' : $aRX[0]
        ConsoleWrite((@error ? "! " : "> ") & $iNum & @TAB & "StringRegExp        : '" & $sStrip & "'" & @CRLF)
    EndFunc
    Alles anzeigen
  • Script läuft nur 1 mal und beendet sich dann.

    • alpines
    • 13. Mai 2019 um 17:04

    Auch wenn du deinen Fehler bereits gefunden hast, kannst du was fürs nächste Mal lernen.

    Du postest einen Codeausschnitt mit sage und schreibe vier Zeilen wovon keine uns Informationen darüber gibt, was im Skript tatsächlich passiert.

    Der Fehler muss so oder so in deiner Funktion liegen und die postest du noch nicht einmal.

  • Hilfe für buttons

    • alpines
    • 11. Mai 2019 um 14:14
    Zitat von SchlafMoon

    Ich probiere das ganze in Notpad++ halt mit Gui mit start und stop Knopf er soll wie gesagt so die Funktion beinhalten

    Und wo soll das am Ende Anwendung finden, bestimmt nicht in Npp?

  • Hilfe für buttons

    • alpines
    • 11. Mai 2019 um 13:11
    Zitat von SchlafMoon

    Er soll halt wie oben Leertaste drücken so wie die taste 9 und die Taste X.
    Mein problem da ist wie oben beschrieben sobald ich auf Start drücke macht mein Programm nichts mehr außer das

    Aber wo sollen die Tastendrücke hingesendet werden? Beschreib uns welches Programm die Tasten empfangen und was die Tastendrücke machen sollen?

    Es gibt 1000 bessere Wege als Send/Mouseclick/PixelSearch zu nutzen.

    Dass du nur einfach rumprobierst kann ich nur schwer glauben, wenn du uns verrätst was du wo machen willst können wir dir besser helfen.

  • Hilfe für buttons

    • alpines
    • 11. Mai 2019 um 09:28

    Was soll dein Skript denn machen? Mit Send-Funktionen können leicht Probleme auftreten wenn andere Fenster auftauchen.

    Wenn du uns verrätst was du wo machen möchtest, können wir dir vielleicht eine bessere Lösung anbieten.

  • For - To : Aufzählung Problem

    • alpines
    • 10. Mai 2019 um 20:13
    Zitat von AspirinJunkie

    Die Zahlen werden im Binärsystem gehalten und dort ist 0,1 (also im Zehnersystem) eben eine solche nicht endlich darstellbare Zahl

    Zitat von AspirinJunkie

    IEEE 754 könnte 1 Milliarde Nachkommastellen speichern können - die Rundungsfehler wären in dem Fall dennoch nicht verschwunden.

    Dahe ist das Problem eben nicht das Datenformat sondern das Zahlensystem.

    Dann würde er aber in den Schleifeniterationen nicht für die erste Hälfte x.1 anzeigen.

    Der Rundungsfehler existiert nach wie vor, allerdings macht er sich ab einer bestimmten Iteration bemerkbar, da intern gerundet/abgeschnitten wird.

    Dass die Erklärung nicht vollständig ist sollte glaube ich nicht überraschen, immerhin gibt es dafür einen vollständigen IEEE-Standard.

  • Exit code 3221225477 bei TrayCreateMenu()

    • alpines
    • 10. Mai 2019 um 09:12
    Zitat von Tuxedo

    Ein Frage an alpines , wenn ich die Globale Variable in der Funktion so deklariere wie ich es in der

    auskommentierten Zeile stehen habe, sollte es aber doch auch machbar sein ohne Probleme oder nicht?

    Bei meiner Variante wird die Globale Variable nur dann deklariert wenn sie noch nicht exisitert,

    die Deklarierung wird also maximal einmal durchgeführt.

    Ich habe nicht viel aber doch ein paar Scripte, wo mir das als beste Löung erschien.

    @Musashi hatte bereits einen wichtigen Punkt angesprochen.

    Zitat von Musashi

    Es geht nicht darum zu prüfen, ob eine globale Variable bereits deklariert wurde. Die globale Variable $g_sString2 ist erst global verfügbar, nachdem Du eine Funktion aufrufst.

    Das wäre die erste Sache. D.h. du erzwingst in deinem Skriptverlauf Implikationen damit alles fehlerfrei abläuft. In diesem Fall musst du erst die Funktion zur Deklaration der Variablen aufrufen damit du diese nutzen kannst.

    Das kann und wird dir viele viele Warnungen schmeißen, da Au3Check nicht sicher sein kann, ob du diese Implikationen auch einhältst.

    Darum erzeugen wir unsere globale Variablen vorher im Skript und setzen sie nachher wenn wir sie benötigen. Wenn möglich sogar direkt, damit wir uns später ein paar Zeilen sparen.

    Schneidere deine Variablen immer auf den engsten Scope wie nur irgendwie möglich, damit du, bspw. in einer Funktion, nur kurz hochscrollen musst um zu sehen ob du auf eine lokale oder globale zugreifst.

    Nichtsdestotrotz:

    Du kannst mit Globalen Variablen in Funktionen trotzdem programmieren, das erlaubt dir ja der Interpreter, allerdings wirst du bei der Fehlersuche mehr Zeit aufwenden, vor allem bei Fehlern die nicht direkt ersichtlich sind.

  • For - To : Aufzählung Problem

    • alpines
    • 9. Mai 2019 um 20:41

    Oh Gott, IEEE 754 schon wieder.

    tl;dr:

    Computer können effizient Kommazahlen nur bis zu einer bestimmten Genauigkeit darstellen um damit schnell rechnen zu können.

    Intern liegt diese als komplett andere Struktur vor als wir Kommazahlen menschlich interpretieren.

    Da diese Genauigkeit Speicherplatz kostet, werden nur Näherungswerte dargestelllt, um dieses Problem zu beseiten solltest du einfach runden oder

    64-Bit Kommazahlen verwenden bspw. in DllStructs.

  • Exit code 3221225477 bei TrayCreateMenu()

    • alpines
    • 9. Mai 2019 um 20:39
    Zitat von Domi78

    Das Problem besteht immer noch. Also lag es nicht wie vermutet am "TrayOnEventMode" oder am TrayItemSetOnEvent() sondern es liegt am TrayCreateMenu().

    Nicht ganz.

    Code
    TrayCreateMenu("Untermenü")
    TrayCreateItem("Text 3")
    TrayItemSetOnEvent(-1, "CallTray")

    Das crasht bei mir nicht.

    Code
    TrayCreateMenu("Untermenü")
    TrayCreateItem("Text 3", -1, -1, 1)
    TrayItemSetOnEvent(-1, "CallTray")

    Das hingegen schon.

    Der Fehler ist ziemlich inkonsistent aber reproduzierbar, wenn du die Zeit und Lust hast kannst du ihm ja gerne im BugTracker auf der engl. Seite melden.

    Ich nehme mal stark an intern werden die -1 als vorheriges GUI-Element statt "kein Menu" fehlinterpretiert und deswegen crasht das ganze.

  • DllStructGetPtr ... Speicher-Dump schlägt fehl

    • alpines
    • 9. Mai 2019 um 16:34
    Zitat von ArminLinder

    Deinen Hinweis auf "fahrlässigen Umgang mit Variablen" habe ich ernst genommen und im Rahmen meiner AutoIt Kenntnisse überdacht, finde aber beim konkreten Code nichts dabei, ihn so zu schreiben. Das direkte Übergeben von Funktionsresultaten als Parameter ist m.E. ein absoluter Standard, sollte ein Interpreter damit nicht zurecht kommen würde ich das als gravierenden Mangel betrachten. Wo genau siehst Du hier kokretes Potenzial, dass die interne Optimierung mir irgendwo dazwischen funkt?

    Was ich meinte war, dass du schnell den Überblick darüber verlierst wenn du den Pointer von GetKeyboardState übergibst.

    Du wärst besser bedient einfach das Ergebnis zu speichern und den Struct zu übergeben statt das neu zu instanziieren mit dem Pointer.

    Im schlimmsten Fall wäre die Referenz ungültig weil du die Variable nicht gespeichert hast (in einem Scope welches noch gültig ist wenn du die Funktion verlässt auch wenn du momentam im globalen Kontext bist - ich spreche von dem Fall wenn du es nicht wärst) und jeder vernünftige Kompiler/Interpreter würde die Referenz entfernen, da du sie nicht mehr brauchst.

    Solche Fehler sind schwierig auszufinden in AutoIt, da keine Warnung oder Fehler geschmissen wird sondern der Interpreter hard-crashed.

    Ich schätze mal du musst 0x81 nehmen, um zu sagen, dass die Taste gedrückt wurde, oder getoggled wurde.

    Wenn du dich in die MSDN einliest wirst du da bestimmt schlau, das was du suchst ist ja der KeyState welchen du zu setzen versuchst.

    Ich bin momentan nicht am Rechner und kann dir nur bedingt aushelfen. Lies dich einfach mal durch die MSDN und schau ob du es nich doch gefixt kriegst.

    Kannst ja berichten und wenn wieder Zeit hab und am Rechner sitz schau ich mir das gerne an, dann kann ich dir auch genauer beschreibne was ich mit den Variablen meinte.

  • Exit code 3221225477 bei TrayCreateMenu()

    • alpines
    • 9. Mai 2019 um 16:16

    Du erzeugst dein Tray innerhalb einer Funktion und erstellst ein Menu in eine Variable mit lokalem Scope.

    Die Referenz geht nach dem Beenden der Funktion verloren und deswegen crasht dein Skript.

    Du solltest NIEMALS in Funktionen globale Variablen deklarieren, höchstens setzen.

    Wenn du deinen Code in den globalen Scope verschiebst (also einfach über die While-Schleife) funktioniert es problemlos.

  • DllStructGetPtr ... Speicher-Dump schlägt fehl

    • alpines
    • 8. Mai 2019 um 23:25
    Zitat von ArminLinder

    - wenn das was $kbdState = DllStructGetPtr(_WinAPI_GetKeyboardState()) zurückbringt sowieso nur ein Pointer auf eine lokale Speicherstruktur ist, ist alles gut, ich kann die Werte getrost vergessen weil sie beim nächsten Mal sowieso neu gesetzt werden.

    - wenn das aber ein Pointer auf eine Windows Struktur ist, wenn ich also permanent etwas verändere auf das auch andere Windows Prozesse zugreifen, wäre das eher nicht gut. und ...

    - ich müsste herausfinden, wie ich eine lokale Kopie dieser Struktur anlege, die ich dann verändern und in den ToUnicodeEx Aufruf stopfen kann

    Da musst du dir keine Sorgen machen, die MSDN schreibt Copies the status of the 256 virtual keys to the specified buffer..

    Das ist referenzfrei, also egal was du dort veränderst, du kannst nichts in Windows selbst verändern.

    Solltest du dennoch Zweifel haben kannst du ja einfach die Funktion nochmal aufrufen und schauen was für Werte du ausliest nachdem du den Buffer, der vorangegangen Funktion, manipuliert hattest.

    Du bist ziemlich vorschnell was die DllStructs angeht, du solltest nicht direkt DllStructGetPtr auf die Funktion anwenden sondern erst das Speichern, was GetKeyBoardState zurückgibt.

    Das gibt dir einen DllStruct zurück die du verändern kannst. Wenn du diese weitergeben willst solltest du erst dann den Pointer erzeugen und verwenden.

    Im schlimmsten Fall ist der Pointer ungültig, weil der DllStruct vom Interpreter beseitigt wurde, weil er denkt es würde niemand mehr drauf zugreifen, da es nirgends mehr auftaucht.

    Oder du findest später einen Bug nicht, weil diese Variable nicht existiert.

    So, nun zu dem Fall was du machen müsstest wenn es KEINE lokale Kopie wäre (was hier NICHT der Fall ist):

    Einfach eine Variable gleich einem anderen Struct setzen klappt leider nicht, wie man hier in diesem Testskript sieht:

    Code
    Local $tStruct = DllStructCreate("int;")
    DllStructSetData($tStruct, 1, 100)
    
    Local $pStruct = DllStructGetPtr($tStruct)
    
    Local $tStruct2 = DllStructCreate("int;", $pStruct)
    
    ConsoleWrite(DllStructGetData($tStruct2, 1) & @CRLF)
    DllStructSetData($tStruct2, 1, 50)
    
    Local $tStruct3 = $tStruct
    Local $tStruct4 = $tStruct2
    
    ConsoleWrite(@CRLF)
    ConsoleWrite(DllStructGetData($tStruct, 1) & @CRLF)
    ConsoleWrite(DllStructGetData($tStruct2, 1) & @CRLF)
    ConsoleWrite(DllStructGetData($tStruct3, 1) & @CRLF)
    ConsoleWrite(DllStructGetData($tStruct4, 1) & @CRLF)
    Alles anzeigen

    Du müsstest also ein neues Struct erstellen (selbe Struktur wie das was du kopieren möchtest) und dann anschließend alle Elemente einzeln kopieren.

    Wenn du Pointer hast, darfst du diese natürlich nicht blind kopieren! Du musst herausfinden auf welche Struktur sie zeigen, diese vorher instanziieren und dann alle Daten davon rüberkopieren und anschließend in deinem neuen Struct (welches das 1. ersetzen sollte) auf den kopierten Inhalt zeigen.

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™