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:

Freebasic DLLs in anderen Sprachen nutzen...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 19.12.2007, 16:23    Titel: Freebasic DLLs in anderen Sprachen nutzen... Antworten mit Zitat

Sind DLLs wirklich universell einsetzbar oder beschränken sich die DLLs die unter Freebasic generiert werden auf Freebasic? Vielleicht mache ich auch einfach nur einen Fehler...

Ich versuche eine "einfache" Funktion aus Freebasic unter (Excel)VBA nutzbar zu machen.
Ich gehe dabei folgender maßen vor:

Ich generiere mit:
Code:

fbc sayhello.bas -dll

Die Datei "sayhello.dll"

der Inhalt von sayhello.bas ist:
Code:

' Test-DLL
function SagHallo CDECL alias "SagHallo" as string export
    return "Hallo Welt!!"
end function




Im "Visualbasic Editor" von Excel 2003 schreibe ich nun folgendes:
Code:

Private Declare Function SagHallo CDecl Lib "sayhello.dll" () As String

Sub DLLTest
    Range("A1").value = SagHallo()
end sub


Versuche ich nun die Sub "DLLTest" laufen zu lassen quitiert mir Excel mit folgender Meldung den Dienst:
Code:

Laufzeitfehler '49':

Falsche DLL-Aufrufkonvention


Kann einer auf anhieb sagen was da falsch läuft oder ob das generell nicht funktionieren kann?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 19.12.2007, 16:29    Titel: Nachtrag: Antworten mit Zitat

Hab da einen anderen thread gefunden der so ungefähr ums selbe geht... aber wirklich weitergeholfen hat er mir auch nicht.. vielleicht spezialisiere ich meine frage mal:

Wie kann ich die von mir beschriebene DLL "sayHello.dll" mit der Funktion "SagHallo()" unter VBA einbinden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 19.12.2007, 17:15    Titel: Re: Nachtrag: Antworten mit Zitat

OneCypher hat Folgendes geschrieben:
Hab da einen anderen thread gefunden der so ungefähr ums selbe geht... aber wirklich weitergeholfen hat er mir auch nicht.. vielleicht spezialisiere ich meine frage mal:

Wie kann ich die von mir beschriebene DLL "sayHello.dll" mit der Funktion "SagHallo()" unter VBA einbinden?


Genauso wie jede beliebige andere DLL eingebunden wird.

Schau dir mal das DLL-Beispiel im Exmaples Ordner an.

Wichtig:
Keine STRING's exportieren sondern nur ZSTRING's
_________________
Rechtbehelf:

Rechschreibverfehlungen, Vergehen an der Deutschen Sprache sowie Stabwechselverbuchselungen unterliegen dem Urheberrecht, sind voll beabsichtigt und fördern das aufmerksame Lesen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 19.12.2007, 22:18    Titel: Antworten mit Zitat

was noch fakt ist, ist, dass FBC an den Funktionsnamen ein @[anzahl der Parameterbytes] anhängt, also in deinem Fall auf SagHallo@0 hinausläuft
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1857
Wohnort: D59192

BeitragVerfasst am: 20.12.2007, 19:11    Titel: Antworten mit Zitat

Aus den dll-Beispielen mit VB habe ich mir dies zusammen gebaut grinsen
Code:
#Include Once "windows.bi"
#Include Once "win/ole2.bi"

'' notice the mangling method, it must be "windows-ms" or VB won't find any function
Extern "windows-ms"

Function SagHallo ( ) As BSTR Export
  Dim arg As ZString Ptr = @"Hallo VBA!"

  '' allocate a ANSI BSTR with the size
  '' return as-is
  Function = SysAllocStringByteLen( arg, Len( *arg ) )

End Function
End Extern
und nur so funktionierte es mit VBA.
Code:
Private Declare Function SagHallo Lib "C:\FB018\Dlltest.dll" () As String

Sub DLLTest()
Range("A1").Value = SagHallo()
End Sub
ohne CDECL aber mit Pfadangabe der DLL.
_________________
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 07.01.2008, 11:20    Titel: Antworten mit Zitat

@ Volta: Wie kompiliere ich denn die dll?
Bei mir erscheint immer:

testdll.bas(5) error 18: Syntax error, found 'windows-ms' in 'EXTERN "windows-ms"'

Egal ob ichs mit -dylib, -dll oder ohne parameter versuche. Zeigt immer den Syntax-error an.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1857
Wohnort: D59192

BeitragVerfasst am: 07.01.2008, 13:14    Titel: Antworten mit Zitat

Hi,
'tschuldigung, das habe ich vergessen mit anzugeben.
Die Compileroption für eine Windows-Dll ist -dll -export .
_________________
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 07.01.2008, 15:34    Titel: Antworten mit Zitat

Ich komm damit leider immer noch nicht zurecht traurig(
Code:

C:\FB>fbc -dll -export testdll.bas
testdll.bas(5) error 18: Syntax error, found 'windows-ms' in 'EXTERN "windows-ms"'


Hab folgende Version:
FreeBASIC Compiler - Version 0.18 (08-13-2007) for win32 (target:win32)

Den Quelltext habe ich genau 1 zu 1 aus deinem Posting rauskopiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1857
Wohnort: D59192

BeitragVerfasst am: 07.01.2008, 16:02    Titel: Antworten mit Zitat

hmm,
Zitat:
C:\FB018\fbc -dll -export "Dlltest.bas"

Make done

das zeigt FBEdit an, und gut ises.
_________________
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 07.01.2008, 16:31    Titel: Antworten mit Zitat

Hatte alles nich geholfen.. Hab mir nun die 18.3b installiert, da kompilierts einwandfrei!
auf einem 2. pc mit der selben version hatte es ebenfalls nicht funktioniert. Also definitiv eine versionsgeschichte..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1857
Wohnort: D59192

BeitragVerfasst am: 07.01.2008, 16:49    Titel: Antworten mit Zitat

ja hast Recht,
ich habe gerade in der 'changelog' nachgesehen, erst mit der Version 018.2b zum 29.9.2007 wurde da nachgebessert. durchgeknallt
_________________
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 07.01.2008, 17:24    Titel: Antworten mit Zitat

Noch ein kleine frage.. ich würde gerne der funktion SagHallo einen String-Parameter übergeben.
Ich schätze mal das muss dann auch ein BSTR sein.. was auch immer das für ein datentyp ist...
Würde mal grob schätzen, um diesen string-datentyp mit freebasic-eigenen string-funktionen bearbeiten zu können muss dieser erst in einen "normalen" string umgewandelt werden.. Weisst du zufällig auch wie das geht?

Hier so ungefähr wie ich mir das vorstelle, was aber nicht funktioniert...
(@VOLTA: Wenn ich deine nerven überstrapaziere, sag bescheid zwinkern )

bsp. dlltest.bas:

Code:

#Include Once "windows.bi"
#Include Once "win/ole2.bi"

'' notice the mangling method, it must be "windows-ms" or VB won't find any function
Extern "windows-ms"

Function SagHallo (TextParameter as BSTR) As BSTR Export
    dim Text as string
    Text = right(TextParameter,4)
    dim ausgabe as zstring * 10
    ausgabe = "Hallo " & Text
  Dim arg As ZString Ptr = @ausgabe

  '' allocate a ANSI BSTR with the size
  '' return as-is
  Function = SysAllocStringByteLen( arg, Len( *arg ) )

End Function
End Extern


In VBA:

Code:


Private Declare Function SagHallo Lib "C:\FB018\Dlltest.dll" (text as string) As String

Sub DLLTest()
Range("A1").Value = SagHallo("Ich mag VBA!")
End Sub



@Volta: *IchVerneigeMichInAllerErfurchtVorDemGroßenProgrammiererGott*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 07.01.2008, 21:21    Titel: Antworten mit Zitat

Hi OneCypher,
ich wußte auch nicht, was BStrings sind, also habe ich das gemacht, was jeder macht, wenn er etwas wissen will: google BSTR
..und da kam wirklich was: http://www.c-plusplus.de/forum/viewtopic-var-p-is-84972.html
Jetz können die BStrings ruhig kommen..
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 08.01.2008, 11:29    Titel: Antworten mit Zitat

Ah ok ... stellt sich für mich leider immer noch die frage wie ich bstr in einen normalen string konvertiere :-/ .. hab schon ein paar versuche mit freebasic gemacht, aber alle string-operanden akzeptieren nur strings oder zstrings.. und in beide formen bekomme ich bstr nicht konvertiert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1857
Wohnort: D59192

BeitragVerfasst am: 09.01.2008, 15:00    Titel: Antworten mit Zitat

Hier habe ich noch ein paar Funktionen in die Dll gepackt mit denen man experimentieren kann.
Eine Lösung für die Umwandlung BSTR in ZString habe ich nicht gefunden aber eine Möglichkeit BSTR in WStrings zu konvertieren.
Die lassen sich dann aber nicht in Excel ausgeben.
Code:
#Include Once "windows.bi"
#Include Once "win/ole2.bi"
'' notice the mangling method, it must be "windows-ms" OR VB won't find ANY FUNCTION
Extern "windows-ms"
Function Zstr2Bstr ( ByVal arg As Zstring Ptr) As BSTR Export
  '' ALLOCATE a ANSI BSTR WITH the size
  '' RETURN AS-IS
  Function = SysAllocStringByteLen( arg, Len( *arg ) )
End Function

Function textlen ( ByVal arg As BSTR ) As Integer Export
  Function = SysStringByteLen (arg)
End Function

Function wtextlen ( ByVal arg As BSTR ) As Integer Export
  Dim w_str As WString*255
  w_str = *Cast(ZString Ptr,arg)
  Function = Len(w_str)
End Function

Function SagHallo ( ) As BSTR Export
  Function = Zstr2Bstr( @"Hallo VBA!")
End Function

Function textausgabe ( ByVal arg As BSTR ) As BSTR Export
  Function = arg
End Function

End Extern

Das VBA-Macro:
Code:
Private Declare Function SagHallo Lib "C:\BLZ\Dlltest.dll" () As String
Private Declare Function textausgabe Lib "C:\BLZ\Dlltest.dll" (ByVal arg As String) As String
Private Declare Function textlen Lib "C:\BLZ\Dlltest.dll" (ByVal arg As String) As Long
Private Declare Function wtextlen Lib "C:\BLZ\Dlltest.dll" (ByVal arg As String) As Long

Sub DLLTest()
Range("A1").Value = SagHallo() 'Text aus der Dll

Range("A2").Value = "Ich mag VBA!" 'die einfachste Methode
Range("A3").Value = textausgabe("Ich mag VBA!")
Range("A4").Value = textausgabe(Range("A1").Value)
Range("A5").Value = textausgabe(Range("A1").Value + " " + Range("A2").Value)

Range("B2").Value = textlen("Ich mag VBA!")
Range("B3").Value = textlen(Range("A3").Value)
Range("B4").Value = wtextlen(Range("A4").Value)
End Sub

Die Funktionen 'textausgabe' und 'textlen' lassen sich mit VBA natürlich einfacher realisieren grinsen
_________________
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
Moewe



Anmeldungsdatum: 21.03.2013
Beiträge: 4

BeitragVerfasst am: 21.03.2013, 19:21    Titel: Antworten mit Zitat

Hallo und Danke für die hilfreichen Antworten,

Hauptproblem war wohl das fehlende EXTERN "windows-ms" ,
die Alias habe ich auch weggelassen.
Jetzt funktioniert das Minibeispiel als Sub und als Funtion:

Freebasic:
Code:

'*****************************************************
EXTERN "windows-ms"
'*****************************************************
SUB cube (BYREF arg As LONG) EXPORT
  arg = arg + 1
END SUB
FUNCTION cube2 (BYREF arg As LONG) AS LONG EXPORT
  arg = arg + 1
  cube2 = arg +10
END FUNCTION
'*****************************************************
END EXTERN

VBA:
Code:

Declare Sub cube Lib "dllex1.dll" (ByRef arg As Long)
Declare Function cube2 Lib "dllex1.dll" (ByRef arg As Long) As Long

Sub Call_Test()
  Dim dblTest As Long
  Dim dblTest2 As Long
  dblTest = 3
  Call cube(dblTest)
  Debug.Print dblTest             'Ergebnis: 4
  dblTest2 = cube2(dblTest)   
  Debug.Print dblTest             'Ergebnis: 5
  Debug.Print dblTest2            'Ergebnis: 15
End Sub


So - jetzt teste ich noch ein wenig mit Arrays und größeren Datenmengen - vermute, ich muss mich noch ein paarmal melden!

LG
Moewe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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