| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		H.Brill
 
 
  Anmeldungsdatum: 09.06.2005 Beiträge: 6
 
  | 
		
			
				 Verfasst am: 09.06.2005, 07:19    Titel: DLL und Strings | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
Ich bin gerade dabei, mit FreeBasic zu
 
experimentieren. Wollte mal in FreeBasic
 
eine simple Test-DLL machen, um sie in
 
einer anderen Sprache zu testen.
 
 
Die Übergabe mit Zahlen (Integer) geht,
 
aber mit der Rückgabe von Strings hapert
 
es ein wenig.
 
 
Hier bräuchte ich ein Rückgabestring per Reference :
 
 
 	  | Code: | 	 		  
 
function Lower (byref a as String ) as String export
 
   Dim t as String
 
   t = LCase$(a)
 
   Lower = t
 
end function
 
 | 	  
 
 
Hat schon jemand Erfahrung gesammelt bzw. kann mir helfen ? | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		PeterHarder
 
  
  Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 09.06.2005, 17:27    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hab' ich auch noch nicht probiert, aber bis eine andere Lösung geposted ist probiere es doch erstmal mit der Rückgabe des Pointers auf den String. Alles Strings sind Nullbyte-Terminiert, d.h. das Auslesen des Strings anhand des Pointers mit anderen Programmen sollte eigentlich keine Probleme bereiten.
 
 
Falls ein nachvollziehbarer Bug dahintersteckt, dies Problem mal im englischen Forum unter www.freebasic.net/forum/ bekanntgeben.
 
 
Gruß, Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
 
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		H.Brill
 
 
  Anmeldungsdatum: 09.06.2005 Beiträge: 6
 
  | 
		
			
				 Verfasst am: 09.06.2005, 18:23    Titel: DLL und Strings | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
wie geht es dann mit Pointern ?
 
Nullterminiert ist schon gut, da der Compiler,
 
der die DLL nutzt, generell Strings byref
 
behandelt.
 
Hab mal folgendes probiert, aber ohne Erfolg :
 
 
 	  | Code: | 	 		  
 
function Lower (byref a as String ) as String ptr export 
 
   Dim t as String 
 
   t = LCase$(a) 
 
   Lower = @t 
 
end function 
 
 | 	  
 
 
So wie es aussieht, hängt es nur an der Rückgabe des
 
Strings. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		PeterHarder
 
  
  Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 09.06.2005, 20:13    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Probiere statt "String Ptr" doch mal "ZString Ptr" oder (oder allgemein nur ZSTring). Aber anstatt "String Ptr" kannst du den Pointer selber auch einfach als "Integer" zurückgeben, das aufruffende Programm merkt das nicht.
 
 
Gruß, Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
 
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 09.06.2005, 20:44    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
hier habe ich eine DLL erstellt
 
evtl.als Anregung für weitere Experimente?
 
 	  | Code: | 	 		  Option Explicit
 
#ifdef __FB_WIN32__
 
'$include: 'win\kernel32.bi'
 
#endif
 
  Declare Function Lower Lib "mydll" Alias "Lower" (ByRef a As String ) As String Ptr
 
  Dim Shared t As String 
 
   Dim Shared hInstance As Integer
 
 
#ifdef __FB_WIN32__
 
' DllMain is the entry-point (ALWAYS needed with DLL's),
 
' don't change the prototype
 
 Function DllMain ( ByVal hModule As Integer, ByVal reason As Integer, _
 
                    ByVal lpReserved As Integer ) as Integer
 
  Select Case reason
 
      Case DLL_PROCESS_ATTACH
 
         hInstance = hModule
 
      Case DLL_THREAD_ATTACH, DLL_THREAD_DETACH, DLL_PROCESS_DETACH
 
  End Select
 
  DllMain = TRUE
 
 End Function
 
#endif
 
 
'(the EXPORT clause must be used here)
 
 
  Function Lower (ByRef a as String) As String Ptr Export 
 
    t = LCase$(a) 
 
    Lower = @t
 
  End Function  | 	  
 
Das Listing hält sich an die mydll.bas aus den Beispielen.
 
 
 	  | Code: | 	 		  '$inclib: 'mydll'
 
Declare Function Lower Alias "Lower" (ByRef a As String ) As String
 
Dim s As String
 
 
s="HGGVOGRTBbb"
 
Print Lower (s),s
 
Sleep  | 	  
 
Hiermit habe ich es ausprobiert. Geht ganz gut!
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		H.Brill
 
 
  Anmeldungsdatum: 09.06.2005 Beiträge: 6
 
  | 
		
			
				 Verfasst am: 10.06.2005, 06:47    Titel: DLL und String | 
				     | 
			 
			
				
  | 
			 
			
				Hallo volta,
 
Ja, wenn ich die DLL auch in FreeBasic
 
anspreche, funktioniert das auch. Aber
 
in meinem Falle (Aufruf von IB-Pro)
 
gehts leider schief.
 
 
Mit ZString komme ich im Moment auch
 
nicht weiter, da beim compilieren der DLL
 
schon Fehler kommen. Muß ich da noch
 
was (.bi) einbinden ? | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 10.06.2005, 10:46    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
ich vermute das liegt an IB, die DLL hier wird als win32-kompatible-dll mit stdcal erstellt, also wie eine DLL für Windows.
 
Wenn du vergleichst wie du zB. Funktionen aus der kernel32.dll in IB deklarierst, so solltest du auch mit dieser DLL klar kommen.
 
 	  | Zitat: | 	 		  | Muß ich da noch was (.bi) einbinden ? | 	  
 
Die .bi habe ich mir erspart. Ich habe auch die Funktion unterschiedlich, in FB als "String" und nicht als "String Ptr" deklariert.
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		H.Brill
 
 
  Anmeldungsdatum: 09.06.2005 Beiträge: 6
 
  | 
		
			
				 Verfasst am: 10.06.2005, 11:44    Titel: DLL und Strings | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
Deshalb habe ich schon IB genommen. Das
 
kommt sonst mit jeder DLL klar, die stdcalls
 
enthält. IB selbst kann solche DLLs erstellen
 
(win32-kompatible-dll mit stdcall).
 
 
Außerdem macht es auch reinen ASM - Output
 
mit dem NASM. Deshalb dachte ich, daß dieses
 
am besten kompatibel sein wird. Ich hab auch
 
schon versucht, mit Pointern die FB-DLL anzu-
 
sprechen. Da ist IB sehr variabel.
 
 
Ansonsten arbeitet IB hervorragend mit der
 
Listview.dll von F.Abbing, die in reinem MASM
 
geschrieben ist (editierbares Listview mit Drag&Drop). | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 11.06.2005, 14:55    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
bei einigen Versuchen zeigt sich, daß zwar der DLL-Header win32-kompatible ist aber die Sub/Funktionen in der DLL nicht.
 
Also ich kann erstmal mit FB keine DLLs für andere Anwendungen schreiben, jedenfals sehe ich keine Möglichkeit.
 
Das FB diese selbst erstellten DLLs ansprechen kann, liegt wohl an den libxyz.dll.a Dateien, die sofort miterstellt werden.
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		PeterHarder
 
  
  Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 11.06.2005, 18:57    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo allerseits!
 
 
 	  | volta hat Folgendes geschrieben: | 	 		  | Also ich kann erstmal mit FB keine DLLs für andere Anwendungen schreiben, jedenfals sehe ich keine Möglichkeit. | 	  
 
 
Nun hab't ihr mich aber auch aus dem Sessel hoch gekriegt!    
 
 
Also, fb hängt (aus welchen gründen auch immer) an die Funktionsnamen noch was an, und zwar einen Klammeraffen gefolgt von einer Zahl. Was da folgt steht in der DLL.A-Datei, aber wenn man die Funktionen von einem anderen Programm aus anspricht, muss man den Aufruf von dort aus genau so angeben, wie es dort drin steht.
 
 
In "examples/dll" ist ja dieses kleine Beispiel "mydll", wenn ich das compiliere und dann mit einem Hex-Editor reinschaue, dann sehe ich, dass aus der Funktion "AddNumbers" plötzlich "AddNumbers@8" geworden ist. Also muss ich das im fremden Programm auch so deklarieren:
 
 
 	  | Code: | 	 		  Declare Function AddNumbers Lib "mydll.dll" _
 
  Alias "AddNumbers@8" ( ByVal operand1 As Integer, _
 
  ByVal operand2 As Integer ) As Integer | 	  
 
 
Also den Functionsnamen als "AddNumbers" belassen und als Alias "AddNumbers@8" eintragen. Wenn ich es so mache, kann ich es jedenfalls von GFA-Basic aus ansprechen (sonst nicht).
 
 
Jetzt zu der Stringrückgabe:
 
Das klappt bei mir nur, wenn ich den Rückgabewert als "Integer" deklariere und dann mit "StrPtr()" den Pointer zurückgebe. Zum Glück gibt es in GFA-Basic den "CHAR{x}"-Befehl, der einen String ab Adresse "x" bis zum nächstfolgenden Nullbyte Basicgerecht ausliest. Wenn man mit einer Programmiersprache arbeitet, die diesen "CHAR{x}"-Befehl zum Belegen eines Basic-Strings nicht hat, dann muss man ihn sich über eine eigene Funktion am besten schnell mal selber basteln, dazu die Api-Funktionen "lstrlen()" und "lstrcpy()" verwenden.
 
 
Schönes Wochenende noch!
 
 
Liebe Grüße
 
 
        Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
 
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		H.Brill
 
 
  Anmeldungsdatum: 09.06.2005 Beiträge: 6
 
  | 
		
			
				 Verfasst am: 12.06.2005, 07:11    Titel: DLL und Strings | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
Ja, ist schon klar mit den Klammeraffen. Hatte
 
ich ja schon von Anfang an gemacht. Ich hatte mir vor
 
einiger Zeit  in PureBasic einen kleinen DLL-Viewer gebastelt,
 
der mir die Funktionen einer DLL anzeigt. Deswegen
 
hatte ich es auch gleich erkannt.
 
 
IB-Pro - Code:
 
 
 	  | Code: | 	 		  
 
OPENCONSOLE
 
DEF name, a : STRING
 
DEF number1, number2, erg : Int
 
 
$Use "mydll.lib"
 
' Lib muß zuvor mit dem beiliegenden LibImporter von der DLL erstellt werden.
 
 
DECLARE Import,AddNumbers Alias AddNumbers@8(n1 : Int, n2 : Int), Int
 
DECLARE Import, Lower Alias Lower@4(st : String), String  
 
 
name = "HELLO"
 
number1 = 5
 
number2 = 10
 
 
PRINT AddNumbers(number1, number2)
 
PRINT Lower(name)
 
 
PRINT
 
PRINT "Press Any Key To Close"
 
DO
 
UNTIL INKEY$ <> ""
 
CLOSECONSOLE
 
END
 
 | 	  
 
 
 Generell scheint das Erstellen einer DLL mit FB
 
ja zu gehen. Die Funktion AddNumbers() wird ja von
 
meinem Programm erkannt und auch ausgeführt. Nur
 
eben bei der Übergabe von Strings halt nicht.
 
Habe die Strings mit BYREF in der DLL deklariert, da
 
IB-Pro generell Strings BYREF übergibt bzw. erhält.
 
Mit Pointer klappt es auch nicht.
 
 
Ist halt etwas schwierig, da es für FB sogut wie keine
 
Doku speziell darüber gibt. Wie mache ich es nun am 
 
besten :
 
 
 
so :
 
 Function Lower (byref a as String ) As String export
 
    t = a 
 
    t = LCase$(t) 
 
    Lower = t 
 
  End Function 
 
oder so:
 
 
 Function Lower (byref a as String ) As String ptr export
 
    t = a 
 
    t = LCase$(t) 
 
    Lower = @t 
 
  End Function 
 
oder so :
 
 
 Function Lower (byval a as ZString ptr ) As ZString ptr export
 
    t = a 
 
    t = LCase$(t) 
 
    Lower = *t 
 
  End Function 
 
 
Ich kann in IB-Pro den String per Ref übergeben und
 
erhalte einen String per Ref. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 12.06.2005, 16:11    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Danke Peter,
 
aufgefallen war mir nur, daß die @4 ohne Leerzeichen hinter dem Funktionsnamen stand. 
 
Aber das in den Namen zu schreiben, auf die Idee bin ich nicht gekommen.
 
Dabei hätte ich mir nur mal eine def-Datei zB. 	  | Code: | 	 		  ; from DirectX 6.1
 
LIBRARY d3dxof.dll
 
EXPORTS
 
DirectXFileCreate@4
 
 | 	  ansehen sollen.
 
Aber dafür 	  | Zitat: | 	 		  | Nun hab't ihr mich aber auch aus dem Sessel hoch gekriegt!  | 	  haben wir dir mal einen unterhaltsamen Nachmittag verschafft    
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		vspickelen
 
  
  Anmeldungsdatum: 12.06.2005 Beiträge: 13 Wohnort: Holland
  | 
		
			
				 Verfasst am: 12.06.2005, 18:28    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo H.Brill
 
 
So gehts am leichtesten:
 
 
(Auf Englisch, leichter fuer mich)
 
 
------------------freeBasic library file Strdll.bas-------------------
 
 	  | Code: | 	 		  
 
REM $INCLUDE: 'win\kernel32.bi'
 
#IFDEF __FB_WIN32__
 
Function DllMain (ByVal hModule As Long, ByVal reason As Long, _
 
 ByVal lpReserved As Long) as Integer
 
   DllMain = TRUE
 
END FUNCTION
 
#ENDIF
 
 
Declare Sub Lower Alias "Lower" (ByRef p As Byte Ptr) 
 
 
Sub Lower (ByRef p As Byte Ptr) export
 
   g$ = *p                'get the string that p points to
 
   g$ = LCase$(g$)        'do something
 
   *p = g$                'point p to the changed string
 
End Sub
 
 | 	  
 
compile  fbc -dll Strdll.bas
 
 
--------------------freeBasic program Makelow.bas---------------------
 
 	  | Code: | 	 		  
 
Declare Sub Lower lib "Strdll" Alias "Lower" (ByRef p As Byte Ptr)
 
 
g$ = "ARGeWEPLOF"    'make string
 
Lower Strptr(g$)     'call sub w/string data address
 
Print g$             'print lowercase string
 
Sleep 
 
 | 	  
 
compile  fbc Makelow.bas
 
 
--------------------VisualBasic includefile Strdll.bi-----------------
 
 	  | Code: | 	 		  
 
Declare Sub Lower Lib "Strdll" Alias "Lower@4" (ByRef s As String)
 
 | 	  
 
write in .vbp-file  Module=Strdll; Strdll.bi
 
 
---------------------VisualBasic subroutine---------------------------
 
 	  | Code: | 	 		  
 
Private Sub LowCase_Click()
 
   g$ = "ARGeWEPLOF"
 
   Lower g$
 
   Print g$
 
End Sub
 
 | 	  
 
That's all. Mind the subtle differences.
 
 
Happy coding!
  Zuletzt bearbeitet von vspickelen am 13.06.2005, 10:21, insgesamt einmal bearbeitet | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 12.06.2005, 20:41    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo vspickelen,
 
der Trick aus VB, geht auch in FB
 
 	  | Code: | 	 		  Declare Sub Lower lib "Strdll" Alias "Lower" (ByRef p As String ) 
 
 
t$ = "ARGeWEPLOF"    'make string 
 
Lower (t$)     
 
Print t$             'print lowercase string 
 
Sleep  | 	  
 
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		vspickelen
 
  
  Anmeldungsdatum: 12.06.2005 Beiträge: 13 Wohnort: Holland
  | 
		 | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Frosch
 
 
  Anmeldungsdatum: 11.06.2005 Beiträge: 5
 
  | 
		
			
				 Verfasst am: 16.06.2005, 14:35    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
 
auch wenn die Frage vielleicht doof ist, aber wofür steht IB??
 
 
Gruß Ralf | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		H.Brill
 
 
  Anmeldungsdatum: 09.06.2005 Beiträge: 6
 
  | 
		
			
				 Verfasst am: 16.06.2005, 16:52    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
IB steht für IBASIC.
 
Siehe :  www.pyxia.com. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Frosch
 
 
  Anmeldungsdatum: 11.06.2005 Beiträge: 5
 
  | 
		
			
				 Verfasst am: 16.06.2005, 17:55    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | H.Brill hat Folgendes geschrieben: | 	 		  Hallo,
 
IB steht für IBASIC.
 
Siehe :  www.pyxia.com. | 	  IBASIC kenne ich nicht. Muss ich doch gleich mal googeln.
 
 
DANKE!
 
 
Gruß Ralf | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		ooops
 
 
  Anmeldungsdatum: 03.10.2005 Beiträge: 16 Wohnort: Bremen
  | 
		
			
				 Verfasst am: 03.10.2005, 20:21    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ergänzung zum Beitrag vspickelen 12.06.05
 
 
Folgendes funktioniert dementsprechend auch in einem Excel VBA-Modul (hier Office 2000):
 
 
 	  | Code: | 	 		  Declare Sub Lower Lib "Strdll" Alias "Lower@4" (ByRef s As String)
 
 
Function LowCase()
 
   g$ = "ARGeWEPLOF"
 
   Lower g$
 
   LowCase = g$
 
End Function
 
 | 	  
 
 
... als Aufruf =LowCase() in einer Excel-Zelle.
 
 
PS: So in normales Modul eintragen. Die Strdll.DLL muß im gleichen Verzeichnis wie die gespeicherte Excel-Tabelle (.xls) stehen.
 
 
Gruß Alexander[/code] | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		vspickelen
 
  
  Anmeldungsdatum: 12.06.2005 Beiträge: 13 Wohnort: Holland
  | 
		
			
				 Verfasst am: 04.10.2005, 10:01    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | ooops hat Folgendes geschrieben: | 	 		  | Folgendes funktioniert [...] als Aufruf =LowCase() in einer Excel-Zelle. | 	  
 
 
Hallo Alexander,
 
 
Gut zu wissen!
 
Wenn das läuft, ist's vielleicht auch möglich um in Excel Langzahlen
 
zu verwenden - mit meinem FreeBasic-Library  BigNumVB.dll  im
 
http://home.versatel.nl/vspickelen/Largefiles/BigNumVB.zip
 
 
Gruß,
 
 vspickelen | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		 |