Script das gleiche, die DLL hat sich nur um folgendes verändert:
-cdecl durch stdcall ausgetauscht
-stdcall musste auch zu den Funktionen selber hin, also auch da hingeschrieben
mehr hab ich eigentlich nicht geändert
GDI+ Bitmap aus DLL zurück an Autoit zurückgeben wie GDI+ selber
-
TheShadowAE -
20. Oktober 2010 um 11:00 -
Erledigt
-
-
DLL behalten (mit cdecl) und Script von Andy nehmen..
Und das geht nicht?bei stdcall muss aber das beachtet werden:
Zitat von progandy:
ZitatDie 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...C
Alles anzeigen// shadowdll.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung. // #include "stdafx.h" extern "C" __declspec(dllexport) int __stdcall BContrast(int,int); int __stdcall BContrast(int x,int y) { return x+y; }
$ret=DllCall(@ScriptDir & "\shadowdll.dll", "int", "_BContrast@8","int",100,"int",4)
[/autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret[0] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug ConsoleWarum 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)
[/autoit]
ConsoleWrite($ret[0] & @CRLF)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 zuder 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)
[/autoit] [autoit][/autoit] [autoit]
;~ $bmp=_BContrast($bmp)
$bmp=_BFehler($bmp)
;~ $bmp=_BZoom_1bpp($bmp)
MsgBox(0,"",_GDIPlus_ImageSaveToFileEx($bmp,@ScriptDir&"\zzz.bmp",_GDIPlus_EncodersGetCLSID("BMP")))
_GDIPlus_BitmapDispose($bmp)_GDIPlus_Shutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _BContrast($bmp,$deleold=True)
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _BFehler($bmp,$deleold=True)
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _BZoom_1bpp($bmp,$deleold=True)
[/autoit]
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
EndFuncIch 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
-