c++ Klassen in Autoit

  • Servus Com 8o

    Ich habe in c++ eine Klassenbibliothek erstellt und hab jtz ne tolle .dll Datei :D

    Kann ich diese nun in AutoIt nutzen?
    Und wenn ja, wie?

    Danke schon mal :D

    PS: bei SuFu finde ich nur 100e Seiten von Progandys Object-UDF...

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • AutoIt kann nur mit stinknormalen "flachen" Funktionen umgehen. C++-Objekte musst du also erst in normale C-Funktionen wrappen bevor du sie in AutoIt per DLLCall nutzen kannst.

    Solltest du dein Objekt jedoch nach den IDispatch-Regeln erstellt haben, kannst du es in AutoIt über die Objekt-Syntax verwenden. Du brauchst nur noch eine Funktion, die dir das Objekt erstellt und an AutoIt weiterleitet. (So machen wir es übrigens in AutoItObject)

  • Danke für den Tipp :)
    Ich versuch mich mal dran
    (Wobei ich noch nicht weiß ob sich der Aufwand lohnt...)

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • Ich habs jtz mal so gemacht.
    Allerdings hab ich noch eine Frage:

    Die Klasse heißt Person, und die Funktion gibt deswegen ein Object vom Typ Person zurück.

    [autoit]

    $aRes = DllCall($dll, "", "PersonCreate")

    [/autoit]


    Was muss ich nun beim AutoIt Aufruf als Rückgabetyp angeben?
    Ich hab bei den gültigen Typen von DllCall nichts gefunden...

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • Wie hast du es denn jetzt gemacht?
    Wenn du Wrapper-Funktionen verwendest, solltest du das Objekt als Referenz zurückgeben.

    Code
    MyObject* MyObjectCreate();
    void MyObjectDestroy(MyObject* obj);
    
    
    int MyObjectFunctionX(MyObject* obj, int x);


    In AutoIt verwendest du dann einfach ptr.

  • Ich habe eine Klasse "Person" erstellt.
    Und eine Funktion, die eine Instanz dieser Klasse erstellt und diese zurückgibt.
    Jetzt weiß ich aber nicht, was ich beim DllCall von AutoIt beim Returntype angeben muss...

    [autoit]

    $aRes = DllCall($dll, "?", "PersonCreate")

    [/autoit]
    Code
    extern "C" Person __declspec(dllexport) __cdecl PersonCreate() {
    	Person temp("Test", 32, "Berlin", 80, 1.82f);
    	return temp;
    }

    So hast du das doch gemeint, oder?

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • Wenn du die Klasse direkt nutzen willst, muss diese als IDispatch implementiert sein. Das ist aber gar nicht so einfach.
    In AutoIt gibt es dann den Typ idispatch.

    Einfacher ist es, die DLLCall-Wrapper zu schreiben.

  • Wenn du ein objekt zurück geben willst, gibtst du einfach den pointer auf das objekt zurück und weist es einem struct zu, welches die gleich variabeln enthält wie die klasse.

  • Wenn muss die Funktion aussehen, wenn sie nen Pointer zurückgibt?

    TestKlasse* Funktion(param n, ..)
    {
    ..
    return &Object;
    }

    gibt nen Error...

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • Nein, so:

    Spoiler anzeigen

    void* GetObject(/**iwas**/)
    {
    return (void*)&Object // Durch die Refernzierung bekommst du den Pointer auf das Objekt, den du dann zurück gibst
    }