DllStruct Funktionen für Autoit

  • Frohen Feiertag wünsch ich euch allen :)

    und folgendes, mich würd mal interessieren, ob mir jemand die nützlichen Anwendungsmöglichkeiten von Dll Struct für Autoit erklären könnte *freu*.

    Also was ich davon hätte , falls ich mal gedenken würde , die Funktionen für DllStruct benutzen zu wollen ?


    Gruß
    John

  • Hi,
    generell kannst du eine Struct wie ein Array benutzen bei gleicher Verarbeitungsgeschwindigkeit.
    Der große Vorteil gegenüber einem Array ist, daß man die Speicherstelle bzw. den Zeiger (Pointer) auf die einzelnen Inhalte der Struct benutzen kann.
    Viele (DLL-)Funktionen benötigen diese Pointer als Ubergabeparameter.
    Weiterhin sind alle Operationen, welche mit Speichern/Verändern von Daten zusammenhängen, einfach machbar, sobald deren Struktur (Struct) bekannt ist.

    Bugfix hat in seinem Tutorial einige Anwendungen beschrieben.

  • Danke Andi für die schnelle Antwort und das Tuturial kenne ich bereits schon, dennoch würd ich gerne wissen ob ich die DllStruct Funktionen nur dafür brauche, wenn ich mit DLL arbeite. Oder kann ich mit DllSruct dies auch als eine Variablen mit vorherdefinierten Datentyp nutzen, damit die Verarbeitung schneller von Autoit läuft, weil ich der Meinung binn solches mal zusammen mit GDI+ gesehen zu haben ?

  • Hi,
    ich hatte schon (im Zusammenhang mit Assembler) die Geschwindigkeit von Arrays und Structs verglichen, aber diese ist in etwa gleich.
    Wenn du also selbst Dll´s schreibst und dort keine Structs benötigst, dann lass es^^

    Für GDI benötigt man Structs nur bei einigen wenigen Funktionen, Geschwindigkeitsrelevant ist das also nicht.

    Allerdings lässt sich in der Kombination mit einer Assembler-UDF und AssembleIt die Geschwindigkeit u.a. von Grafikfunktionen vervielfachen, da kommt man allerdings um die Verwendung von Structs nicht herum.

    Aber auch in "native" AutoIt lässt sich eine Bitmap pixelweise recht einfach und schnell bearbeiten, wenn man sie in eine Struct kopiert und byteweise bearbeitet.

  • Hi,
    ich hatte schon (im Zusammenhang mit Assembler) die Geschwindigkeit von Arrays und Structs verglichen, aber diese ist in etwa gleich.
    Wenn du also selbst Dll´s schreibst und dort keine Structs benötigst, dann lass es^^


    Nein ich selber schreibe keine Dll´s, nutze aber welche mit DllCall.

    Zitat


    Für GDI benötigt man Structs nur bei einigen wenigen Funktionen, Geschwindigkeitsrelevant ist das also nicht.


    warum ist das so?

    Zitat


    Allerdings lässt sich in der Kombination mit einer Assembler-UDF und AssembleIt die Geschwindigkeit u.a. von Grafikfunktionen vervielfachen, da kommt man allerdings um die Verwendung von Structs nicht herum.


    Auf die FASM UDF bin ich zufällig vor tagen bereits schon gestoßen und wie meinst du das jetzt bitte - special in verwendung mit deinem selbstgeschriebenen Debugger?

    Zitat


    Aber auch in "native" AutoIt lässt sich eine Bitmap pixelweise recht einfach und schnell bearbeiten, wenn man sie in eine Struct kopiert und byteweise bearbeitet.


    Aber warum sollte man dies bitte machen, um etwa ein paar takte Rechenzyklen zu sparen ?

    Ich wird aus diesen DllStruct Funktion noch irgendwie nicht so ganz schlau ?(

    Nun gut, ich hoffe ich nerve nicht mit meinen Fragen :)

  • Hi,
    ich frag mal vorsichtig, wie du überhaupt auf dieses Thema kommst....

    Denn:
    a) brauchst du für "normale" Programmierung keine Structs => Thema erledigt
    b) falls externe Dll´s verwendet werden, die einen Pointer auf einen Datenbereich als Parameter benötigen, kommst du um Structs nicht herum =>Bugfixens Tut, erledigt


    Eine Struct ist nichts anderes als ein Bereich von Daten, auf deren Position im Speicher du direkt Zugriff hast.
    Wenn du das nicht benötigst, dann brauchst du auch keine Struct!
    Allerdings hindert dich niemand daran, deine Daten (Variablen) ausschliesslich in Structs zu schreiben, und dann über Pointer zu schreiben/lesen. Dann brauchst du auch sicher keinen Obfuscator mehr, denn diesen Code kann und will sicher keiner mehr lesen^^. Funktionieren wird es schon, schneller oder langsamer ist es nicht, einfach nur eine andere Art, mit den Daten umzugehen.

  • Ja mich interessiert es einfach mal , weil ich hin und wieder dieses DllStruct Stuff in irgendein beliebigen sourcodes sehe. Und das es mit Speicher zu tun hat , habe ich bereits auch schon vernommen. Es ist auch möglich die Datentypen dort zu bestimmen (und vielleicht auch noch der Ort im Memory), und soweit ich weiss is das in Programmiersprachen glaube ich durchaus üblich.

    Ach ja externe Dll´s wollt ich auch schon mal nutzen, und um die anzusprechen und rückrufe zu erwarten , müßte man glaub ich wissen weche CallingConvention die benutzt und dann vermutlöich dazu nen DllStruct erstellen so irgendwie .

    Und ansonsten ist es auch als ein Art Angeberei hier zu verstehen wenn ich in einem sourcecode Variablen Inhalte als Struct eingebettet sehe, wobei es eigentlich nicht nötig tut ?(

    • Offizieller Beitrag
    Zitat

    Und ansonsten ist es auch als ein Art Angeberei hier zu verstehen wenn ich in einem sourcecode Variablen Inhalte als Struct eingebettet sehe, wobei es eigentlich nicht nötig tut ?(


    Keinesfalls würde ich das so sehen. Die Tatsache, dass AutoIt weitestgehend mit einem einzigen Datentyp (variant) arbeitet, ist nicht unbedingt immer von Vorteil. Bei Verwendung von Strukturen ist man gezwungen Datentypen einzuhalten und aus einem Zahlenstring kann dann nicht einfach ein Integer werden - String bleibt String.

  • BugFix
    Du meinst, wenn jemand so programmiert ist es eher ne Angewohnheit von einer höheren Programmiersprache, dies auch so in Autoit anzuwenden. wie z.B $sVariable = 'String und $iWert = 28 ?

  • Zitat

    String bleibt String

    wzbw^^

    [autoit]

    $struct_float=dllstructcreate("float[5]");5 floatzahlen
    dllstructsetdata($struct_float,1,4.52301424904732e+024,1);floatzahlen in Speicher eintragen
    dllstructsetdata($struct_float,1,6.34941479652706e+022,2)
    dllstructsetdata($struct_float,1,2.74865539637211e+020,3)
    dllstructsetdata($struct_float,1,7.21364385566043e+022,4)
    dllstructsetdata($struct_float,1,1.19923122576918e-041,5)
    $struct_char=dllstructcreate("char[20]",dllstructgetptr($struct_float));struct erstellen an Position der Floatzahlen
    Msgbox(0,"",dllstructgetdata($struct_char,1));Speicher auslesen

    [/autoit]
  • @Andi
    Du Angeber ;)
    anstatt es es jetzt in Nulln und Einsen, dezimal oder hex im struct zu verarbeiten,
    präsentierst du mir hier nen float Gruß lol

    @all
    Nochmal Autoit wurde doch erstellt um möglichst einfach zu sein, wieso kam man denn jetzt auf die Idee, dort DllStruct Funktion mit einzubinden, wobei findet es in Autoit am meisten eine sinnvolle Verwendung für ?

    • Offizieller Beitrag

    Nochmal Autoit wurde doch erstellt um möglichst einfach zu sein, wieso kam man denn jetzt auf die Idee, dort DllStruct Funktion mit einzubinden, wobei findet es in Autoit am meisten eine Verwendung für ?


    Wie Andy schon sagte: Entweder im Zusammenhang mit Dll oder in anderen speziellen Fällen (z.B. wenn du nur einen Integer besetzen kannst, wie bei _GUICtrlListviewSetItemParam, aber einen ganzen Schwung an Daten unterbringen mußt - da kommst du um Strukturen, hier einen Integer-Pointer der auf die eigentlichen Daten verweist, nicht herum.)

  • Mit GUI´s habe ich seit meiner 1 Jährigen Autoit Karriere so gut wie noch nie mit gearbeitet. die Laufen unter einer Dauerschleife und machen Autoit langsmer richtig ?

    Nun gut, mit exteren Dll´s würd ichauch gerne zusammenarbeiten, also diese mit Autoit ansprechen können. Dazu müsste man glaub ich erst einmal wissen, welche Structur diese Dll benutzt und mit Struktur ist glaub ich die calling convesion gemeint oder ? und dann könnte man mit dem richtigen Autoit DllStruct dazu die externe Dll gezielt ansprechen ?

    Soweit meine mal gelesene und vermutlich verstandene Theorie ;(

  • Zitat

    Nochmal Autoit wurde doch erstellt um möglichst einfach zu sein

    yepp, und die Erde war am Anfang auch eine Scheibe ;)
    Mittlerweile gibt es in AutoIt bis auf extrem wenige Ausnahmen nichts, was man programmtechnisch nicht realisieren könnte.
    Und für einige Sachen benötigt man zwangsläufig Structs.
    Ob man das in AutoIt machen muß oder besser gleich eine "geeignetere" Sprache verwendet, bleibt jedem selbst überlassen.

  • Zitat

    und mit Struktur ist glaub ich die calling convesion gemeint oder ?

    zwei völlig verschiedene Paar Schuhe :D

    Zitat

    Mit GUI´s habe ich seit meiner 1 Jährigen Autoit Karriere so gut wie noch nie mit gearbeitet. die Laufen unter einer Dauerschleife und machen Autoit langsmer richtig ?

    auch falsch^^

    Zitat

    und dann könnte man mit dem richtigen Autoit DllStruct dazu die externe Dll gezielt ansprechen ?

    FALLS die Dll mit Structs arbeitet oder nicht die Daten selbst, sondern einen Pointer (Zeiger im Speicher auf die Daten) als Übergabeparameter verwendet, DANN benötigst du Structs, ansonsten brauchst du auch für einen Dllcall keine Struct.

  • aha also nicht alle Dll´s arbeiten mit Struct, es kommt also drauf an wie diese oder mit was es programmiert wurden ist .
    Und ist es auch so das es Dll´s gibt, die man nicht mitDdllCall sondern mit DllStruct Funktionen aufrufen muß ?