dlls für berechnungen

  • hoi ich habs auch direkt mal ausprobiert, weil es mich schon ne ganze zeit interessiert wie die dlls so aufgebaut sind aber ein paar fragen hätte ich noch.
    das ist ja der code:

    Code
    extern "C" int __declspec(dllexport) myfunc (int x)
    {
    return (x*2);
    }

    so, was bedeutet denn jetzt genau das:

    Code
    extern "C" int __declspec(dllexport) myfunc (int x)


    wieso extern"C"?? wieso int__declspec(dllexport)?? das letzte ist klar.

    Und was ist wenn ich in eine Dll mehr Fubktionen packen will sieht das dann so aus?

    Spoiler anzeigen

    und zum teil werden ja auch Icons in eine dll gepackt wie funktioniert das?

    mfg Darter

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Hab auch mal eins gemacht. Du kannst den Stil ja kopieren.


    nicht schlecht aber hast du da auch mal die Source daz?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • extern "C" bedeutet, dass die dll Funktion im C Stil erstellt wird (zumindest glaub ich das)

    Und den Quellcode zum Tic Tac Toe gibts NOCH nicht, damit yxyx ein bissl nachdenken muss :D

  • extern "C" bedeutet, dass die dll Funktion im C Stil erstellt wird (zumindest glaub ich das)

    Und den Quellcode zum Tic Tac Toe gibts NOCH nicht, damit yxyx ein bissl nachdenken muss :D


    Aber mein bsp mit mehr funktionen in einer dll ist schon richtig so oder und du könntest mir wenn du willst du source ja als pm schicken ;)

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Das Beispiel ist schon richtig.

    Den Quellcode geb ich her, wenn der andere wenigstens versucht hat ein Tic Tac Toe zu machen. Sonst hat er die Lösung ja schon auf der Hand, und schreibt alles ab.

  • sowas geht aber nicht :( Kann man denn keine array returnen?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Arrays gehen schon, ich kann jedoch nur eine Lazarus-Dll (FreePascal) als Beispiel anbieten:

    [autoit]

    $Dll = DllOpen("Arraydll.dll")
    If @error Then Exit

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

    $aRet = DllCall($Dll, "ptr", "ReturnArray")
    If @error Then Exit

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

    $tStruct = DllStructCreate("DWord[10]", $aRet[0])
    For $i = 1 To 10
    ConsoleWrite($i & " " & DllStructGetData($tStruct, 1, $i) & @LF)
    Next
    DllClose($Dll)

    [/autoit]

    Das geht sicher auch mit C++

  • wow tut mir leid aber ich verste da nur bahnhof ich war froh, dass ich ne einfache dll erstellen konnte und diese callen aber vllt kannst du mir ja deinen code etwas erläutern. :rolleyes:

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Zitat


    Und den Quellcode zum Tic Tac Toe gibts NOCH nicht, damit yxyx ein bissl nachdenken muss


    ja das is klar :D
    naja idee hab ich schon nur iwie will das programm wenn ich was änder die änderungen nich übernehmen

  • Im Prinzip gibt man nicht das Array als solches zurück, sondern nur seinen Pointer...

    in meinem Beispiel ist PArray der Pointer zu TArray.
    genauer kann ich das leider auch nicht beschreiben ;)


    Edit:
    Vielleicht hilft es, wenn du dir das so vorstellst:

    Code
    Type
    TArray = Array[0..10] of DWord;
    PArray = ^TArray;

    =

    [autoit]

    $TArray = DllStructCreate("DWord[10]")
    $PArray = DllStructGetPtr($TArray)

    [/autoit]
  • ich habs mal so probiert:

    die dll:

    und ein script dazu:

    [autoit]

    $Dll = DllOpen("Dll_Test.dll")
    Myerrorcheck()
    $aRet = DllCall($Dll, "ptr", "myfunc2")
    Myerrorcheck()
    $tStruct = DllStructCreate("int", $aRet[0])
    Myerrorcheck()
    $Structdata = DllStructGetData($tStruct, 1, 1)
    Myerrorcheck()
    MsgBox(0,"",$Structdata)

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

    Func Myerrorcheck()
    If @error Then
    MsgBox(0,"Fehler",@error)
    Exit
    EndIf
    EndFunc

    [/autoit]

    ich hab kp ob das auch nur ansatzweise richig ist aber im prinzip zeigt mein pointer auf das erste element meines Arrays so müsste das doch richitg sein oder?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ich hab mir jetzt nur mal den C++ Code angeschaut, und da sind einige Fehler drin:

    An alle, die sich mit Pointern nicht so auskennen: Seit bloß vorsichtig (Bin mir nichtma sicher, ob ich alles richtig gemacht hab.)

  • Hi,

    hab mich mal durchgelesen und wollte auch mal meinen Senf dazu geben.

    Wenn ich die Funktion "myfunc2" in C++ folgendermaßen verwende:

    Spoiler anzeigen

    Wird auf der Konsole folgendes ausgegeben:
    "0x22ff30", sowie der Wert "2293472", komisch sollte eigtl. "111" sein.

    Warum das passiert ist im Endeffekt ganz einfach, da in C++ bzw., ich glaub in jeder Programmiersprache, ein Array nichts anderes als ein Pointer/Zeiger
    ist.
    Wenn man in einer Funktion eine Variable deklariert, wird nach dem Funktionsaufruf, diese Speicherstelle (Adresse) wieder vom Wert der Variable "bereinigt",
    die Speicheradresse bleibt vorhanden, nicht aber der Wert, dem man dieser zugewiesen hat.
    Um dieses Problem gibt es das Schlüsselwort "new".
    Mit diesem fordern wir Speicher an, der erst wieder freigegeben wird, wenn wir mit "delete" dies sagen.

    "new" benötigt noch einen Datentyp, sowie muss es wissen ob mehrere verlangt werden:
    "delete" benötigt die Speicheradresse, welche wiederfreigegeben werden soll.

    Spoiler anzeigen
    Code
    int* p = new int;
    int* pt = new int[3];
    
    
    delete p;
    delete[] pt;

    Mal als Beispiel:

    Spoiler anzeigen
    Code
    int* ArrayTest(int x)
    {
       int* aRet = new int[2];
       aRet[0] = x;
       aRet[1] = x * 2;
       return aRet;
    }

    Wir haben hier den Speicher von zwei "int"´s angefordert und mit dem Wert "x" und "x*2", belegt, wir können nun auch noch nach dem Funktionsaufruf diese Werte weiterverwenden.

    Verwenden wir diese "Funktion" mal als Beispiel:

    Spoiler anzeigen


    Tada, das Programm gibt uns nun die Speicheradresse von T[0] an, sowie den Wert von T[0].
    Warum gerade die Adresse von T[0], nun ein Array beginnt bei 0 und, solange man den Zeiger darauf nicht verändert zeigt er immer auf den ersten Wert:

    Erhöhen wir nun den Zeiger "T" um 1, so zeigt er auf die nächste Adresse, bzw. in diesem Fall den nächsten Wert:

    Der somit berichtigte Anfangscode lautet nun:

    Spoiler anzeigen

    Es ist möglich in C++ ein Array zurückzugeben, der Speicher dazu muss allerdings mit "new/new[x]" angefordert werden, dieser muss dann allerdings mit "delete/delete[]" freigegeben werden.
    Möchte man nur einen "int" anfordern schreibt man nur "new int" und dann "delete xyz", möchte man mehrere "int"´s anfordern, dann
    "new int[x]" und "delete[] xyz", wobei "xyz", die Speicheradresse ist, mit der der Speicher angefordert wurde.
    Statt "int" geht natürlich auch jeder andere Datentyp.

    Hoffe, dass ich alles klar und verständlich erklärt habe.

    LG
    Ealendil

    PS: Ist zwar ein AutoIt-Forum, aber ich dachte vlt. braucht das mal ein AutoIt-ler für C++.

    Einmal editiert, zuletzt von Ealendil (6. Juni 2010 um 11:45)