GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber

  • DLL behalten (mit cdecl) und Script von Andy nehmen..
    Und das geht nicht?

    bei stdcall muss aber das beachtet werden:

    Zitat von progandy:

    Zitat

    Die Alternative wenn man stdcall verwenden will, ist folgendes: Im EXPORTS-Abschnitt der .def-Datei müssen die Funktionsnamen aufgelistet werden.

  • hab jetzt mal rumexperimentiert, wie gesagt, es gibt kaum einen der weniger Ahnung von C++ hat als ich^^
    Aber wenn ich folgendes im VC++ compiliere und die dll in AutoIt aufrufe, klappt es...

    [autoit]

    $ret=DllCall(@ScriptDir & "\shadowdll.dll", "int", "_BContrast@8","int",100,"int",4)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret[0] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    Warum ein Unterstrich VOR den Funktionsnamen gesetzt wird und die Anzahl der Bytes auf dem Stack hinter den Funktionsnamen müsste man mal jemanden fragen, der Ahnung hat^^

  • @ Andy:
    ganz simples Beispiel:

    DLL:

    Code
    #include "stdafx.h"
    
    
    
    
    extern "C" __declspec(dllexport) int __cdecl BContrast(int x,int y)
    {
    	return x+y;
    }


    Script:

    [autoit]

    $ret = DllCall(@ScriptDir & "\bitmap.dll", "int:cdecl", "BContrast", "int", 100, "int", 4)
    ConsoleWrite($ret[0] & @CRLF)

    [/autoit]


    Ich weiß nicht, was du mit Unterstrich meinst, außerdem probiert mal, die { } direkt unter dem extern "c" zu setzen!

  • mein Beispiel führt disassembled zu

    Code
    .text:10001010 ; __stdcall BContrast(x, x)
    .text:10001010                 public _BContrast@8
    .text:10001010 _BContrast@8    proc near


    dein Beispiel zu

    Code
    .text:10001010                 public BContrast
    .text:10001010 BContrast       proc near

    der einzige Unterschied ist, dass du anstatt __stdcall mit cdecl-Konvention arbeitest. Oder ist der führende Unterstrich und das angehängte @8 am Funktionsnamen vom Compiler beabsichtigt, um stdcall erkennbar zu machen?
    Hat wohl mit den Aufrufkonventionen zu tun bei VC++, denn bei _fastcall gibts ein führendes @ und das angehängte @8 im Funktionsnamen!

  • Danke das ganze funktioniert jetzt, aber führt mal folgendes aus:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    $dat=FileOpenDialog("Bild auswählen","","Bilder(*.png;*.jpg;*.bmp)")

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

    _GDIPlus_Startup()

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

    $bmp=_GDIPlus_BitmapCreateFromFile($dat)
    ;~ $bmp=_BContrast($bmp)
    $bmp=_BFehler($bmp)
    ;~ $bmp=_BZoom_1bpp($bmp)
    MsgBox(0,"",_GDIPlus_ImageSaveToFileEx($bmp,@ScriptDir&"\zzz.bmp",_GDIPlus_EncodersGetCLSID("BMP")))
    _GDIPlus_BitmapDispose($bmp)

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

    _GDIPlus_Shutdown()

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

    Func _BContrast($bmp,$deleold=True)
    Local $nbmp
    Local $ret=DllCall(@ScriptDir&"\BetterBitmap.dll","ptr*:cdecl","BContrast","ptr*",$bmp,"bool",False)
    If $deleold Then _GDIPlus_BitmapDispose($bmp)
    $nbmp=$ret[0]
    Return $nbmp
    EndFunc

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

    Func _BFehler($bmp,$deleold=True)
    Local $nbmp
    $ret=DllCall(@ScriptDir&"\BetterBitmap.dll","ptr*:cdecl","BFehler","ptr*",$bmp,"bool",False)
    If $deleold Then _GDIPlus_BitmapDispose($bmp)
    $nbmp=$ret[0]
    Return $nbmp
    EndFunc

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

    Func _BZoom_1bpp($bmp,$deleold=True)
    Local $nbmp
    $ret=DllCall(@ScriptDir&"\BetterBitmap.dll","ptr*:cdecl","BZoom_1bpp","ptr*",$bmp,"bool",False)
    If $deleold Then _GDIPlus_BitmapDispose($bmp)
    $nbmp=$ret[0]
    Return $nbmp
    EndFunc

    [/autoit]

    Ich lade eine *.bmp und lasse BFehler ausführen, das klappt ohne Fehler, aber die MessageBox sagt "False", es wird nichts gespeichert.

    C++-Code und DLL im Anhang

    Wär super nett wenn ihr mir helft, ich hätte endlich nochmal etwas fertig mit C++, dass es ohne Fehler läuft