Hallo Frank,
So geht es
'
' FREEBAISC EXAMPLE :
'
#Include Once "windows.bi"
#INCLUDE ONCE "win/ole2.bi"
'#INCLUDE ONCE "mydll.bi"
'--------------------------------------------------------------------
' "MyDLL.DLL": created with Powerbasic PBWIN 10 DLL
'--------------------------------------------------------------------
'
Extern "windows-ms"
Declare FUNCTION MyFunction1 LIB "MyDLL" _
Alias "MyFunction1" (BYVAL Param1 AS LONG) AS Long
End Extern
'--------------------------------------------------------------------
Dim library AS Any Ptr
Dim lparam As long
Dim As Long lRes, x, y
'--------------------------- problem ----------------- //
lRes = MyFunction1(lRes)
Print "Exe result from MYDLL.DLL:" + STR$(lRes)
'--------------------------- problem ----------------- //
Randomize TIMER
x = RND * 10
Print x; " ="; myFunction1( x)
Sleep
'EXTERN "Mangling"' startet einen Block, innerhalb dessen alle Deklarationen andere interne Bezeichner erhalten, als sie von FreeBASIC bekommen würden. Dies hat für den Programmfluss keine direkten Auswirkungen. Bei der Rückgabe von Fehlermeldungen oder beim Debuggen mittels externer Programme kann dies allerdings von Vorteil sein.
•EXTERN "C": setzt alle Prozeduren auf CDECL und erhält die Groß-/Kleinschreibung von allen Namen. Dasselbe Verhalten erreicht man ohne EXTERN durch die Aufrufkonvention CDECL zusammen mit einem ALIAS-String, der exakt denselben Prozedurnamen enthält.
•EXTERN "C++": wie EXTERN "C", stellt die Namen zusätzlich aber auf die Konventionen von g++-4.x
•EXTERN "Windows": setzt alle Prozeduren auf STDCALL, erhält die Groß-/Kleinschreibung von allen Namen und setzt zusätzlich das Suffix "@N" an alle Prozedurnamen, wobei N die Größe aller Parameter der jeweiligen Prozedur in Bytes ist.
•EXTERN "Windows-MS": wie EXTERN "Windows", nur dass das Suffix unter DOS/Windows nicht angehängt wird.
Grüße Peter