Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 24.02.2008, 19:42 Titel: Über- und Rückgabe von Float Werten in DLL |
|
|
Hi zusammen,
ich möchte gerne in FB eine DLL machen die ich von BlitzBasic aus nutzen will. Ich kann soweit alle Werte nach FB übergeben, nur die Rückgabe von Float Werten klappt nicht und ich weis nicht warum.
Die Funktion sieht bei mir so aus:
Code: | Public Function MeinFloat Cdecl ( F As Single ) As Single Export |
Hierbei kommt der Float Wert von Blitz in FB an, hab ich mir ausgeben lassen - geht. Aber in Blitz bekomme ich einen Memory Access Violation bei Aufruf der Funktion und ich konnte es soweit eingrenzen das es an der Rückgabe liegt, also AS SINGLE EXPORT.
Hat das schonmal jemand hinbekommen? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 24.02.2008, 23:00 Titel: |
|
|
Ums nochmal zu spezifizieren hier der gesamte Quellcode:
Code: | Declare Function MeinFloat Lib "FB-BB" Alias "MeinFloat" ( ByVal A As Single, ByVal B As Single ) As Single
Declare Function MeinString Lib "FB-BB" Alias "MeinString" ( S As ZString Ptr ) As ZString Ptr
Declare Function MeinInteger Lib "FB-BB" Alias "MeinInteger" ( I As Integer ) As Integer
Declare Function MeineBank Lib "FB-BB" Alias "MeineBank" ( B As Any Ptr ) As Integer
'Hier wird ein Float empfangen und zurück gegeben
Function MeinFloat ( ByVal A As Single, ByVal B As Single ) As Single Export
If A > B Then B = A
Function = B
End Function
'Hier wird ein String empfangen und zurück gegeben
Function MeinString ( S As ZString Ptr ) as ZString Ptr Export
'auf den String greifen wir über den Pointer zu
*S = "Ich habs empfangen"
'wir geben einen String wieder zurück
Return S
End Function
'Hier wird ein Integer empfangen und zurück gegeben
Function MeinInteger ( I As Integer ) As Integer Export
'Wir geben den Wert 1234 an BlitzBasic zurück
Return 1234
End Function
'Hier wird eine Speicherbank empfangen und die gefüllte Bank sowie ein Integer zurückgegeben
Function MeineBank ( B As Any Ptr ) As Integer Export
Dim i As Integer
'Wir füllen die Speicherbank mit Werten
For i = 0 To 15
Poke Byte, B + i, 255 - i
Next
Return 1
End Function |
Warum zu Henker geht die Float Funktion nicht? Ich hab mal einen anderen Quellcode ausprobiert und compiliert - da gehts. Wenn ich diesen Code hier compiliere gehts nicht - ist doch nicht normal - oder? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.02.2008, 15:59 Titel: |
|
|
Hmmm,
ich habe deinen Quellcode als FB-BB.dll compiliert und hiermit getestet:
Code: | DECLARE FUNCTION MeinFloat LIB "FB-BB" ALIAS "MeinFloat" ( BYVAL A AS SINGLE, BYVAL B AS SINGLE ) AS SINGLE
DECLARE FUNCTION MeinString LIB "FB-BB" ALIAS "MeinString" ( S AS ZSTRING PTR ) AS ZSTRING PTR
DECLARE FUNCTION MeinInteger LIB "FB-BB" ALIAS "MeinInteger" ( I AS INTEGER ) AS INTEGER
DECLARE FUNCTION MeineBank LIB "FB-BB" ALIAS "MeineBank" ( B AS ANY PTR ) AS INTEGER
Dim As Single erst=0.5, zweit=1.5
?MeinFloat (erst, zweit)
?MeinFloat (2.7, zweit)
sleep
| keine Probleme unter FB018.3, ME . Alles OK!! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 25.02.2008, 16:00 Titel: |
|
|
Ich weiß nicht, inwiefern das auf BB zutrifft, allerdings weiß ich, dass man CDECL in Libs verwenden sollte, falls sie von anderen compilern als FBC benutzt werden. Schreib einfach mal CDECL an der Funktion und prüfe dann, ob es klappt. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.02.2008, 16:12 Titel: |
|
|
Wenn BB DLLs mit der Aufrufkonvention CDECL verlangt muss dies bei der Erstellung der DLL in FB auch angegeben werden.
Normal (ohne Angabe) benutzt FB STDCALL .
EDIT/
hier http://www.blitzbase.de/tabellen/history.htm Version 1.77 steht:
Zitat: | Der DLL-Aufruf-Modus "CDECL" wurde um "STDCALL" erweitert. CDECL-DLL's werden mit C erstellt. STDCALL-DLL's können dagegen mit allen Programmiersprachen geschrieben werden. Die Erkennung der DLL geschieht automatisch. | Es sollte also in BB ohne CDECL (evtl. mit STDCALL) funktionieren. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 25.02.2008, 18:49 Titel: |
|
|
Also es funktionieren beide Varianten von BB aus. MIttlerweile hab ich rausgefunden das es gar nicht an der Float Funktion, sondern an der String Funktion lag. Da gibt es eine Merkwürdigkeit.
Wenn ich eine DLL Funktion erstelle die nur einen einzelnen String übergibt, dann kann ich diesen Beispielsweise als "T As String" übergeben.
Übergebe ich neben dem String noch mehrere Parameter, z.B. den Pointer auf eine Bank, dann muß ich "T As ZString" machen. In jedem anderen Fall bekomme ich eine Schutzverletzung (bzw. einen MAV) unter BlitzBasic - das finde ich komisch. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
|