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

Beiträge von Andy

  • AlignComment richtet Kommentare aus Update 13.08.2016

    • Andy
    • 24. Oktober 2010 um 14:57

    Hi zusammen,
    durch meine nur rudimentären RegEx-Kenntnisse werden leider nicht 100%ig die Kommentare vom Programmcode getrennt.
    Daher kann es vorkommen, dass in bestimmten Kombinationen von ",´ und ; innerhalb von Programmzeilen einige Leerzeichen eingefügt werden. (z.B. bei structs). Bisher habe ich aber noch keinen "fehlerhaften" Programmcode provozieren können! Daher ist das eher ein kosmetisches Problem.

    Wer aber dennoch eine "sichere" RegEx findet oder kennt um Kommentare vom Code zu trennen (eigentlich benötigt man den Kommentartrenner doch in jeder Programmiersprache) bitte ich um Info!

  • h2au3

    • Andy
    • 24. Oktober 2010 um 10:08

    Sehr fein!

    Zitat von UEZ

    Falls ich mal von MSN benötige, dann wird dein Tools wohl sehr hilfreich sein!

    Was heisst hier falls?^^ Es gibt noch reihenweise Funktionen, die nicht ge"Wrapper"t sind, und ehrlich gesagt schreibe ich schneller einen Dllcall mit den MSDN-Informationen (und jetzt erst recht), als das ich in diversen Foren und auf meiner Platte nach einer vielleicht schon umgesetzten AutoItfunktion suche! Von bereits vorhandenen C(++) Funktionen garnicht zu reden....

    Weiterhin werden auch diejenigen befriedigt, deren größte Leistung ein fleissiges C&P beinhaltet! "Schreib mir mal einer den dllcall, ich hab nicht kapiert was man da machen muss!" ist somit auch per C&P erledigt ;) Natürlich nur, wenn man in der Lage ist, das vorgestellte Programm zu bedienen (und zu finden)....

  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 23. Oktober 2010 um 23:28

    mein Beispiel führt disassembled zu

    Code
    .text:10001010 ; __stdcall BContrast(x, x)
    .text:10001010                 public _BContrast@8
    .text:10001010 _BContrast@8    proc near


    dein Beispiel zu

    Code
    .text:10001010                 public BContrast
    .text:10001010 BContrast       proc near

    der einzige Unterschied ist, dass du anstatt __stdcall mit cdecl-Konvention arbeitest. Oder ist der führende Unterstrich und das angehängte @8 am Funktionsnamen vom Compiler beabsichtigt, um stdcall erkennbar zu machen?
    Hat wohl mit den Aufrufkonventionen zu tun bei VC++, denn bei _fastcall gibts ein führendes @ und das angehängte @8 im Funktionsnamen!

  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 23. Oktober 2010 um 18:35

    hab jetzt mal rumexperimentiert, wie gesagt, es gibt kaum einen der weniger Ahnung von C++ hat als ich^^
    Aber wenn ich folgendes im VC++ compiliere und die dll in AutoIt aufrufe, klappt es...

    C
    // shadowdll.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung.
    //
    
    
    #include "stdafx.h"
    
    
    
    
    extern "C" __declspec(dllexport) int __stdcall BContrast(int,int);
    int __stdcall BContrast(int x,int y)
    {
    return x+y;
    }
    Alles anzeigen
    [autoit]

    $ret=DllCall(@ScriptDir & "\shadowdll.dll", "int", "_BContrast@8","int",100,"int",4)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret[0] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    Warum ein Unterstrich VOR den Funktionsnamen gesetzt wird und die Anzahl der Bytes auf dem Stack hinter den Funktionsnamen müsste man mal jemanden fragen, der Ahnung hat^^

  • Filterungsproblem von Klammern ( vielleicht mit Regexp?)

    • Andy
    • 23. Oktober 2010 um 17:58
    Spoiler anzeigen
    [autoit]

    $string = "((a+b)-(a*(b+a)))+b"
    $k = 1 ;klammerebene

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

    _terme($string, $k)

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

    Func _terme($a, $k)
    $o = StringInStr($a, "(", 1, -$k) ;öffnende Klammer
    If $o = 0 Then ;keine klammer mehr gefunden
    MsgBox(0, 0, $a)
    Return ;rekursionsebene zurück
    EndIf
    $s = StringInStr($a, ")", 1, $k, $o) + 1;schliessende Klammer
    $term = StringMid($a, $o, $s - $o) ;dazwischen
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$term' & @LF & @LF & 'Return:' & @LF & $term) ;### Debug MSGBOX
    _terme($a, $k + 1) ;neu aufrufen, nächste klammerebene
    Return ;rekursionsebene zurück
    EndFunc ;==>_terme

    [/autoit]
  • Filterungsproblem von Klammern ( vielleicht mit Regexp?)

    • Andy
    • 23. Oktober 2010 um 17:37

    Rekursiv auf jeden Fall, allerdings würde ich von der letzten="innersten" öffnenden Klammer ausgehen und dann bis zur schliessenden einlesen.
    nächster Rekursionsschritt:vorletzte öffnende bis zur 2. schliessenden Klammer usw

  • Flaches Datenformat in Tabelle Konvertieren

    • Andy
    • 23. Oktober 2010 um 17:31

    So?

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    Dim $zeilen
    _FileReadToArray("messwerte.txt", $zeilen)
    ;_ArrayDisplay($zeilen)

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

    ;Tabellenkopf mit 5 spalten erstellen durch tabs getrennt
    $tabelle = @TAB
    For $i = 1 To 4 ;4 zeilen einlesen
    $tabellenkopf = StringSplit($zeilen[$i], @TAB, 3) ;ggf delimiter anpassen
    ;_arraydisplay($tabellenkopf)
    $tabelle &= $tabellenkopf[0] & @TAB
    Next
    $tabelle &= @CRLF ;neue zeile

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

    ;Tabelle ausfüllen
    For $i = 1 To $zeilen[0] Step 4
    $messwert = StringSplit($zeilen[$i], @TAB, 3) ;ggf delimiter anpassen
    ; _ArrayDisplay($messwert)
    $tabelle &= $messwert[1] & @TAB ;zeilenanfang
    For $t = $i To $i + 3 ; alle 4 Messwerte eintragen
    $messwert = StringSplit($zeilen[$t], @TAB, 3) ;ggf delimiter anpassen
    $tabelle &= $messwert[2] & @TAB ;zahlen eintragen
    Next
    $tabelle &= @CRLF ;neue zeile
    Next

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

    FileWrite("auswertung_messwerte.txt", $tabelle)
    ShellExecute("auswertung_messwerte.txt")

    [/autoit]
  • AutoIt & Virtueller Drucker (Druckauftrag zwei mal drucken)

    • Andy
    • 23. Oktober 2010 um 12:09

    Ich würde aus dem Rechnungsprogramm in eine Datei drucken, diese per "copy /b datei.bin Drucker1" an den ersten Drucker schicken, und dann nochmal an Drucker2

    Eine weitere Möglichkeit wäre, aus dem Rechnungsprogramm auf Drucker1 zu drucken, per rundll32 printui.dll den (Standard-)Drucker umzuschalten, und dann aus dem Rechnungsprogramm nochmal zu drucken

  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 22. Oktober 2010 um 14:16

    entweder im c++ ändern oder im autoitcall^^

  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 22. Oktober 2010 um 13:53

    Hi,
    autoIt nimmt standardmässig den stdcall an, wenn du cdecl verwendest, dann musst du das im Dll-Aufruf mitteilen

    [autoit]

    Func _BetterBitmap($bmp,$deleold=True)
    Local $nbmp
    Local $ret=DllCall(@ScriptDir&"\BetterBitmap.dll","ptr*:cdecl","BContrast","ptr*",$bmp,"bool",$deleold)
    $nbmp=$ret[0]
    $ret=DllCall(@ScriptDir&"\BetterBitmap.dll","ptr*:cdecl","BFehler","handle",$nbmp)
    $nbmp=$ret[0]
    Return $nbmp
    EndFunc

    [/autoit]
  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 21. Oktober 2010 um 21:12

    hi, nochmal für mich zum mitschreiben:
    Welche Variablen/Parameter brauchst du IN der Dll, die von AutoIt übergeben werden müssen?
    bsp:
    AutoIt dllcall (hoehe,breite) ===> dllfunc bitmap(hoehe,breite)

    und gibt die Dll-Funktion einen Wert an AutoIt zurück? welchen?

  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 20. Oktober 2010 um 21:42

    wenn du vor dem dllcall die bitmap noch garnicht hast, sondern erst in der dll erstellt, brauchst du natürlich auch keinen Parameter an die dll zu übergeben!
    Dein Parameter neuebitmap ist dann der Rückgabeparameter!

    [autoit]

    $ret = DllCall("deinedll.dll", "handle", _ ;handle oder pointer ist egal, dieselbe "datenstruktur"
    , "FunktionsNameInDerDll") ;dein c++-funktionsname

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

    $HBITMAP = $ret[0] ;die rückgabe aus der Dll einer AutoIt-variablen zuweisen

    [/autoit]
  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 20. Oktober 2010 um 21:34

    ok, dann reicht eine ganz normale "Variable" im AutoIt-dllcall.
    mach mal das * hinter Bitmap weg, dann musst du in AutoIt den Pointer nicht auswerten (dazu müsstest du eine struct erstellen an der Position des Pointers und dort den Wert BITMAP auslesen)

    also wäre der call

    [autoit]

    $HBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap(blahblah) ;diese Variable, NICHT DEn POINTER, würde ich an die dll übergeben

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

    $ret = DllCall("deinedll.dll", "ptr", _ ;handle oder pointer ist egal, dieselbe "datenstruktur"
    , "FunktionsNameInDerDll", _ ;dein c++-funktionsname
    , "ptr", _ ;handle oder pointer, der von der AutoItfunktion zurückgegeben wurde, dword geht auch....
    , $HBITMAP) ;variable, in der die Rückgabe der AutoItfunktion steht

    $HBITMAP=$ret[0] ;die rückgabe aus der Dll einer AutoIt-variablen zuweisen

    [/autoit]
  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 20. Oktober 2010 um 21:01

    Da fragste mal wieder den richtigen^^, aber wieso willst du Pointer übergeben?

    Zitat

    aber eigentlich suche ich nach GDI+ Bitmapübergabe

    erklär das mal genauer....in AutoIt bekommst du $IRGENDWAS als Rückgabe einer _GDIplus_schlagmichtot()-Funktion.
    Oder willst du den Pointer auf die BitmapDATEN = Pixeldata AARRGGBB übergeben?
    Das ist erstmal schnurz und piepe. Der Datentyp (z.B. INT) ist nur dazu da die Anzahl und ggf auch die Ausleserichtung der an die Dll-funktion zu übergebenden Bytes festzulegen.
    Der Asterix * ist nur dazu da, statt den WERT den Zeiger (Pointer) auf die Speicherstelle des Wertes zu übergeben.
    In Assembler z.B.
    VAR db 7
    erstellt an der Speicherstelle 0x00234567 ein dword mit dem Inhalt 00 00 00 07
    ein mov eax, VAR würde 0x00234567 in eax schreiben, entsprechend *VAR in C++ (der pointer auf die variable)
    aber mov eax,[VAR] würde 00 00 00 07 ins eax schreiben, entsprechend VAR in C++ (der inhalt der variable)

    Also kommts nur drauf an, sich zu einigen zwischen AutoIt-Dllcall und C++ Funktion in der Dll
    WAS du letztendlich übergibst ist völlig schnurz, wichtig ist nur, dass der Empfänger (die dll-func) weiss, was der Sender (AutoIt) abgeschickt hat!

    Zeig doch mal die ersten 5 Zeilen deiner dll-Funktion in C++, so dass man sehen kann was dort überhaupt angefordert wird

  • Moderation für neue Mitglieder (Shoutbox)

    • Andy
    • 20. Oktober 2010 um 20:41

    Falls hochgradig geistiger Dünnschiss in der SB gespammt wird, haben die PU meiner Ansicht nach die Pflicht, das sofort zu löschen!
    Kopie/Screenshot, und dann ab damit ins NUL-Device!
    Die Mods können dann nach entsprechender Info das weitere in die Wege leiten....

    BugFix , ins PU-forum verschieben diesen Thread?

    Edit BugFix: Nein, ich schließe das Thema hiermit. Da es nicht von einem PU eröffnet wurde, lasse ich es stehen.

  • GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

    • Andy
    • 20. Oktober 2010 um 20:34

    Hi,
    es kommt natürlich drauf an, was du überhaupt an "deinedll.dll" übergeben möchtest.
    Mal angenommen, du hast aus einer GDI-Funktion in autoIt ein HBITMAP erhalten, dann sollte der Call so aussehen:

    [autoit]

    $HBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap(blahblah) ;diese Variable, NICHT DEn POINTER, würde ich an die dll übergeben

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

    $ret = DllCall("deinedll.dll", "handle", _ ;abhängig davon, was deine dll-funktion zurückgibt, ggf auch ein fehlercode...dann z.b. int(fehlernummer) oder bool
    , "FunktionsNameInDerDll", _ ;dein c++-funktionsname
    , "ptr", _ ;handle oder pointer, der von der AutoItfunktion zurückgegeben wurde, dword geht auch....
    , $HBITMAP) ;variable, in der die Rückgabe der AutoItfunktion steht

    ;"ptr*" verwenden, wenn du in der dll den pointer auf die VARIABLE mit dem Inhalt HBITMAP auswerten willst

    [/autoit]
    Zitat

    Muss ich in der DLL noch extra GDI+ Startup aufrufen?

    nein

  • GDI+ Bitmap.SetPixel

    • Andy
    • 18. Oktober 2010 um 19:28
    Zitat

    Was kann ich mit so einem Kantenbild jetzt anstellen?

    Im engl. Forum habe ich zzt mit jemandem Kontakt, der per Bilderkennung die Länge und den Durchmesser von Spiralfedern ermitteln möchte. Das klappt schon ziemlich gut! Die Spiralfeder wird dabei mit einer Kamera aufgenommen und unabhängig von ihrer Lage auf dem Bild sollen Maße ermittelt werden. Das ist recht einfach mit Autoitcode machbar, WENN und da kommt die Kantenerkennung ins Spiel, die Umrisse der Spiralfeder auf dem Bild genau zu lokalisieren sind. Der Sobel-Algorithmus führt zu beeindruckenden Ergebnissen.
    Du darfst allerdings das wischiwaschi-auf_34kb_komprimierte_JPG nicht als Maßstab nehmen. Die Kante kann nur so gut erkannt werden, wie das ursprüngliche Bild Daten herausrückt. Ich habe bei mehreren Testbildern (komprimiertes JPG) festgestellt, dass der RGB2HSL teilweise die 16x16 Blöcke eines JPG-Bildes komplett in eine "Farbe" umwandelt! Da wird dann aus
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    das da
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    Da kann der Algorithmus nix dafür! Man kann halt nicht immer aus Sch*** Gold machen^^

    Dateien

    image.jpg 34,73 kB – 0 Downloads edge.bmp 1,12 MB – 290 Downloads
  • Alle Möglichkeiten von Buchstaben anzeigen

    • Andy
    • 17. Oktober 2010 um 20:09

    Wer in der Lage ist, in der Hilfe zu lesen, findet dort mehrere Funktionen, die genau das gewünschte machen....

    Zitat

    Hallöchen, ich würde gerne ein Script schreiben,

    dann poste mal, was du bereits als Script hast, denn das hier ist ein Hilfe-Forum und kein "Sucht_mir_mal" oder "Schreibt_mir_mal"-Forum!

  • gemeinsame Variable oder Programmschnittstelle zur selbstständigen Zusammenarbeit meiner Programme machen

    • Andy
    • 17. Oktober 2010 um 16:45

    ja, zum Beispiel. In den Scripten dann eine Struct mit der Größe des Speicherbereichs definieren, und "drüber" legen.

    [autoit]

    $struct=dllstructcreate("byte[1000]",$pointer_alloc)
    ;auslesen mit
    $inhalt=dllstructgetdata($struct,1)

    [/autoit]


    Wenn es trouble in reserviertem oder geschützten Speicherbereichn gibt, hilft WriteProcessMemory

  • gemeinsame Variable oder Programmschnittstelle zur selbstständigen Zusammenarbeit meiner Programme machen

    • Andy
    • 17. Oktober 2010 um 16:20

    Eine relativ einfache Variante ist, ein bissl shared memory zu allocaten und den Pointer auf diesen Speicher auf ein DUMMY-Control der anderen Scripte zu SENDen. Dann kann man fleissig auch größere Daten austauschen.

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™