[gelöst]Problem mit C++ DLL

  • Hallo liebe C++ und AutoIt'ler ;)
    Ich habe hier ein problem mit meiner DLL.
    Mein DLL Code :

    main.cpp
    Code
    #include "main.h"
    using namespace std;
    
    
    int DLL_EXPORT add(int num1, int num2)
    {
    return num1 + num2;
    }
    main.h

    Diesen Code kompiliere ich mit dem Microsoft Visual C++ 2005/2008 compiler mit folgenden optionen:
    Enable C++ exception handling (no SEH) [/EHs]
    und
    extern "C" defaults to nothrow

    MS Visual C++ 2008 ist auch installiert.

    Code::Blocks kompiliert ohne Errors und ohne Warnings.

    Nun habe ich folgendes AutoIt Skript.

    Spoiler anzeigen
    [autoit]

    $dll = DllOpen("api.dll")
    $retn = DllCall($dll, "int:cdecl", "add", "int", 20, "int", 44)
    If @error Then ConsoleWrite("Error:" & @error & @CRLF)
    MsgBox(0, "", $retn)
    DllClose($dll)

    [/autoit]

    Dieser Code funktioniert (aber nicht so wie er soll).
    Mit int:cdecl bleibt die MsgBox leer. Mit int statt int:cdecl schreibt er in die Konsole Error:3,
    in der Hilfe steht dass das bedeutet,
    die Funktion wurde nicht gefunden, aber das kann doch nicht stimmen ?!?!
    Was muss ich machen damit ich keinen Error bekomme ?

    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

    3 Mal editiert, zuletzt von PrideRage (5. September 2010 um 10:27)

  • Die Funktion heißt add und weiterhin kann es sein, dass du entweder in AutoIt cdecl als Aufrufschema aktivieren musst oder ein @NN an den Funktionsnamen anfügen musst (NN ist dabei die Zahl der Bytes, die alle Parameter zusammen benötigen)

  • Mein Fehler :/ die testFunc war noch vom verherigem lauf.

    @progandy 
    Ich rufe die Funktion nun mit dem Rückgabetyp "int:cdecl" statt "int" auf, nun kommt der error nicht mehr,
    aber die MsgBox bleibt leer.
    @NN funktioniert nicht (habe add@16 und add@32 versucht)

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Die Zahl wäre wenn überhaupt 8 (int = 4 bytes).
    Ob du sie brauchst, bekommst du einfach mit z.B. dem DependencyWalker heraus, der die Funktionsnamen der DLL anzeigt.

    Du brauchst sie ja offensichtlich nicht, da du die cdecl-Konvention beim kompilieren verwendet hast ;)
    Wegen der leeren Rückgabe solltest du dir nochmal in der Hilfe die Rückgabe von DLLCall genauer anschauen. Das ist nmlich ein Array.