Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 19.12.2007, 17:23 Titel: Freebasic DLLs in anderen Sprachen nutzen... |
|
|
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 |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 19.12.2007, 17:29 Titel: Nachtrag: |
|
|
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 |
|
|
Bimi
Anmeldungsdatum: 03.12.2007 Beiträge: 66
|
Verfasst am: 19.12.2007, 18:15 Titel: Re: Nachtrag: |
|
|
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 |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 19.12.2007, 23:18 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 20.12.2007, 20:11 Titel: |
|
|
Aus den dll-Beispielen mit VB habe ich mir dies zusammen gebaut
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 |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 07.01.2008, 12:20 Titel: |
|
|
@ 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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 07.01.2008, 14:14 Titel: |
|
|
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 |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 07.01.2008, 16:34 Titel: |
|
|
Ich komm damit leider immer noch nicht zurecht (
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 07.01.2008, 17:02 Titel: |
|
|
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 |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 07.01.2008, 17:31 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 07.01.2008, 17:49 Titel: |
|
|
ja hast Recht,
ich habe gerade in der 'changelog' nachgesehen, erst mit der Version 018.2b zum 29.9.2007 wurde da nachgebessert. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 07.01.2008, 18:24 Titel: |
|
|
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 )
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 |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 07.01.2008, 22:21 Titel: |
|
|
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 |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 08.01.2008, 12:29 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 09.01.2008, 16:00 Titel: |
|
|
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 _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Moewe
Anmeldungsdatum: 21.03.2013 Beiträge: 4
|
Verfasst am: 21.03.2013, 20:21 Titel: |
|
|
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 |
|
|
|