Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

DLL und Strings
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
H.Brill



Anmeldungsdatum: 09.06.2005
Beiträge: 6

BeitragVerfasst am: 09.06.2005, 07:19    Titel: DLL und Strings Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeterHarder



Anmeldungsdatum: 27.03.2005
Beiträge: 45
Wohnort: Deutschland

BeitragVerfasst am: 09.06.2005, 17:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
H.Brill



Anmeldungsdatum: 09.06.2005
Beiträge: 6

BeitragVerfasst am: 09.06.2005, 18:23    Titel: DLL und Strings Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeterHarder



Anmeldungsdatum: 27.03.2005
Beiträge: 45
Wohnort: Deutschland

BeitragVerfasst am: 09.06.2005, 20:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 09.06.2005, 20:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
H.Brill



Anmeldungsdatum: 09.06.2005
Beiträge: 6

BeitragVerfasst am: 10.06.2005, 06:47    Titel: DLL und String Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 10.06.2005, 10:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
H.Brill



Anmeldungsdatum: 09.06.2005
Beiträge: 6

BeitragVerfasst am: 10.06.2005, 11:44    Titel: DLL und Strings Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 11.06.2005, 14:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeterHarder



Anmeldungsdatum: 27.03.2005
Beiträge: 45
Wohnort: Deutschland

BeitragVerfasst am: 11.06.2005, 18:57    Titel: Antworten mit Zitat

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! zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
H.Brill



Anmeldungsdatum: 09.06.2005
Beiträge: 6

BeitragVerfasst am: 12.06.2005, 07:11    Titel: DLL und Strings Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 12.06.2005, 16:11    Titel: Antworten mit Zitat

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 lachen
Gruß
Volta
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
vspickelen



Anmeldungsdatum: 12.06.2005
Beiträge: 13
Wohnort: Holland

BeitragVerfasst am: 12.06.2005, 18:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 12.06.2005, 20:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
vspickelen



Anmeldungsdatum: 12.06.2005
Beiträge: 13
Wohnort: Holland

BeitragVerfasst am: 13.06.2005, 10:11    Titel: Antworten mit Zitat

Und auch ohne Klammern um's t$ läufts wie eine 1.

FB ist'ne schene Sprache um ein großes DLL zu bauen:
Langzahl-Arithmetik in BASIC http://mitglied.lycos.de/vspickelen/Largefiles/Nachladen.htm

Houdoe!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Frosch



Anmeldungsdatum: 11.06.2005
Beiträge: 5

BeitragVerfasst am: 16.06.2005, 14:35    Titel: Antworten mit Zitat

Hallo,

auch wenn die Frage vielleicht doof ist, aber wofür steht IB??

Gruß Ralf
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
H.Brill



Anmeldungsdatum: 09.06.2005
Beiträge: 6

BeitragVerfasst am: 16.06.2005, 16:52    Titel: Antworten mit Zitat

Hallo,
IB steht für IBASIC.
Siehe : www.pyxia.com.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Frosch



Anmeldungsdatum: 11.06.2005
Beiträge: 5

BeitragVerfasst am: 16.06.2005, 17:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ooops



Anmeldungsdatum: 03.10.2005
Beiträge: 16
Wohnort: Bremen

BeitragVerfasst am: 03.10.2005, 20:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
vspickelen



Anmeldungsdatum: 12.06.2005
Beiträge: 13
Wohnort: Holland

BeitragVerfasst am: 04.10.2005, 10:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz