C++ Dll & Autoit

  • Guten abend,

    Ich lerne grade derzeit C++, und ich möchte mich jetzt ein bischen mit Dll´s & Dllcall´s beschäftigen, nur gibt es ein kleines Problem
    das mir Autoit wenn ich die Dll aufrufe ein Fehler zurück gibt, und ich sehe den Fehler nicht und weis nicht ob es an Autoit liegt oder an C++.
    Ich habe schon viel gegooglet aber alle machen es genauso wie ich.

    Hier mein C++ Code den ich zum Test erstellt habe:

    Spoiler anzeigen
    Code
    #include "stdafx.h"
    
    
    
    
    extern "C" double __declspec(dllexport) add (double a, double b)
    {
        return a+b;
    }

    Und hier mein Autoit Code:

    Spoiler anzeigen
    [autoit]

    $a=5
    $b=10

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

    $add=DllCall("Test_dll.dll","double:cdecl","add","double",$a, "double", $b)

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

    if IsArray($add) Then
    MsgBox(0,"Erfolg",$add[0])
    Else
    MsgBox(64,"Fail",$add)
    EndIf

    [/autoit]

    (Projekt Dateien im Anhang)

    Ich würde mich über Antworten freuen. ;)

    Ps. Wie habt ihr C++ bzw. andere Hochsprachen gelernt?, via Buch, Unterricht, Videos?

    Dateien

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

    Einmal editiert, zuletzt von PuReIroNie (12. August 2013 um 14:27)

  • Wird die Funktion auch genau mit dem Namen 'add' exportiert? Schau mal mit dem DLLExplorer oder Dependency-Walker nach. Ansonsten sollte es wohl passen. Hab jetzt allerdings nichts downgeloaded. 1,29MB für eine DLL die nur eine add-Funktion und eine AutoIt-Skript enthält ist recht groß ;)

  • Ja das ist das ganze Projekt^^, ich habe es nicht sorgfältig gesäubert.
    Ich habe mir meine Dll mit dem Dependency Walker angeschaut, und da wo bei anderen Dll´s die Funktionen stehen steht bei meiner nichts.

    Marthog
    ah fehler von mir, ich habe mein Script mit x64 aufgeführt, mit x32 geht es; Danke.
    Aber dann hab ich noch eine Frage, wie kann man eine Dll für x64 Kompatibel machen?

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Hi,

    Zitat

    Üblicherweise ist entweder dein Programm mit allen DLLs 64 bit oder alles ist 32 bit.

    kann man so stehen lassen^^

    Allerdings gibt es noch eine weitere Möglichkeit, eine Dlll gleichzeitig für 32+64Bit zu verwenden!
    Die Funktionen in der Dll werden dann nicht direkt angesprungen, sondern über eine Art "Wrapper". Dieser erkennt Anhand des Aufrufs und der Konventionen, ob ein 32-Bit- oder 64-Bit-Call vorliegt und springt dann die eigentliche Funktion mit den "richtigen" Parametern an.
    Imho aber überflüssig, da es wohl nur bei SEHR speziellen Funktionen einen Vorteil von 64- zu 32-Bit-Funktionen gibt.
    2 Dll´s, eine als dll32 und die andere als dll64 compiliert und damit hat es sich idR....

  • k Danke für die Infos^^, Meine Frage währ aber jetzt wie man sein (dll) Script in c++ als x64 Compillieren kann?, dazu hab ich bei Google nichts gefunden.
    Und fals jemand ein Beispiel für die Doppelverwendung bon x32 & x64 kennt würd ich mich auch freuen ;)

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Und fals jemand ein Beispiel für die Doppelverwendung bon x32 & x64 kennt würd ich mich auch freuen ;)


    Würde ich ganz einfach so machen, aber vielleicht hat ja jemand eine bessere Idee.

    [autoit]

    Global $MyDLL
    If @AutoItX64 Then
    $MyDLL = DllOpen(@ScriptDir & "\mydll64.dll")
    Else
    $MyDLL = DllOpen(@ScriptDir & "\mydll32.dll")
    EndIf

    [/autoit]

    //Edit: Ich gehe einfach mal davon aus, dass du die Doppelverwendung der beiden DLLs in einem AutoIt Skript meinst.

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (13. August 2013 um 13:00)

  • Meine Frage währ aber jetzt wie man sein (dll) Script in c++ als x64 compillieren kann?

    Das hängt vom Compiler ab. Soweit ich weiß kann man bei Visual Studio nur mit der kostenpflichtigen Version 64 bit compilen, dann kann man das aber ganz einfach umstellen.

    Beim gcc kann man das mit dem Commandlineparameter -m64 bzw. -m32 festlegen, vorausgesetzt man hat die richtige Version, bei Windows braucht man z.B. die hier. Die Projektdateien der IDE muss man natürlich entsprechend selber konfigurieren.

    Bei anderen compilern kenn ich mich nicht so genau aus, aber z.B. Clang und der Intel compiler (kostenpflichtig und extrem teuer) können das auch.


    Man sagt bei C++ übrigens nicht Skript.

  • James
    Die Verwendung in Autoit kenn ich natürlich, aber trotzdem Danke.

    Zitat

    [...] kostenpflichtigen Version 64 bit compilen [...] einfach umstellen.


    Ok Danke dies wusste ich noch nicht, ich dachte zuvor man liegt es selbst im Code fest, wenn man eine 64 bit Variable verwendet.

    Ok dann bleib ich lieber bei x32, denn 500€ sind es mir nicht wert ;)
    Und mein "Training" ist auf vc++ angepasst und ich komme mit der IDE gut aus.

    Zitat

    Man sagt bei C++ übrigens nicht Skript.


    Weis ich aber nach Jahren von Autoit ist es im Kopf eingebrannt :D

    Ps. Welche IDE benutzt ihr oder könnt ihr empfehlen Übersichtlichkeit/Leistung/Sicherheit mäßig?

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Gibt es Große abweichungen zwischen den verschiedenen Compiler?
    Also ob man recht Komplexe Codes aus VS in z.B Codeblocks compillen kann ohne große abänderungen zu machen?

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Wenn du Standardkonformes C++ schreibst, sollten auch alle aktuellen Compiler das schaffen.
    Allerdings löst der gcc wesentlich mehr Fehlermeldungen und Warnungen aus, weil der VC++ sehr viel Murks einfach hinnimmt.
    Es kommt auch auf die C++ Version an.
    So unterstützt VC++ afaik noch keine range based for loops (foreach), eine neue gcc-Version kann hingegen fast alle C++11 Features.

    Code::Blocks ist kein Compiler, sondern nur die IDE, die Dateieditor und Compilersteuerung in einem ist. Als Compiler kann man eigentlich jeden nehmen (auch den Visual Studio Compiler), allerdings bietet sich für deine Zwecke gcc (genauer MinGW-w64) an.

  • Bei M$ kann man den 64-Bit-Compiler auch in das kostenlose Visual Studio einbinden
    http://msdn.microsoft.com/en-us/library/…s(v=vs.90).aspx

  • Ok, vielen Dank^^
    alle Fragen geklährt.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes: