Seite 2 von 3
Verfasst: 24.10.2004 01:52
von jear
Gute Frage, ob man DLL's auch für andere BS herstellen kann....
Mir gelingt es mit Windows nicht!
1. Habe das Beispiel aus der Hilfe zur DLL verarbeitet.
Kann auch Funktionen per CallFunction und CallFunctionFast auslösen.
Es will mir aber einfach nicht gelingen, einen Wert aus der DLL an das rufene Programm zurückzugeben. Die Rückgabestrings sind alle schön Global definiert.
2. Kann man Konstanten zur Steuerung einer DLL-Function so ablegen, dass sie Global verfügbar sind?
3. Es bringt nichts, die erzeugte DLL in das Verzeichnis UserLibraries zu legen. Sie trägt ein anderes Icon zur Schau und wird dort offenbar nicht erkannt. Was muss man dazu noch tun?
4. Gibt es zu der DLL-Programmierung irgendwo ein gutes Tutorial?
Verfasst: 24.10.2004 03:08
von Falko
Wäre schön, wenn man zu einer Frage evt. einen kleinen Beispiel-Source sehen könnte.
Damit könnte man vielleicht durch das Anpassen weiterhelfen.
Ich hoffe zu Punkt 1 könnte dieses Beispiel vielleicht passen.
Zu Punkt 3: Die DLL's sind keine PB-Librarys. Wenn du aus
www.PureAreanet die Library "Talibit" läds, könntest du damit diese
Libs erstellen.
Ich hoffe ich konnte ein wenig weiterhelfen.
MfG Falko
Code: Alles auswählen
;Falko
;
#MakeMatheDLL = 0; Wenn 0 und Option auf DLL, dann compile mathe.dll
;#MakeMatheDLL = 1; Wenn 1 und Option auf Windows, dann compile Exe oder Teste mit F5
CompilerIf #MakeMatheDLL = 0
;-------------------------DLL-----------
Global Result.f
ProcedureDLL mul(a.f,b.f)
Result = a * b
ProcedureReturn Result
EndProcedure;------------End------------
CompilerElse
;------------------- compile EXE oder compile/start---------
OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu ,"Test.dll")
If OpenLibrary(1,"mathe.dll")
Ergebnis.f = CallFunction(1,"mul",20.0,20.0)
MessageRequester("Ergebnis","20*20="+Str(Ergebnis))
Else
MessageRequester("Fehler","konnte DLL nicht öffnen")
EndIf
Repeat:Until WaitWindowEvent()=#PB_EventCloseWindow
CloseLibrary(1)
CompilerEndIf
;------------------------- End--------------------------------
Verfasst: 24.10.2004 10:37
von Froggerprogger
zu 3)
DLLs kannst Du aber anstelle im UserLibraries-Verzeichnis im Compiler-Verzeichnis ablegen. Dann kann Du sie direkt mit OpenLibrary(1, "name.dll") öffnen. Allerdings muss sie natürlich später im Verzeichnis der EXE liegen.
Verfasst: 24.10.2004 16:11
von jear
Danke für die Hinweise.
TailBite habe ich mir geladen und installiert.
Seither bekomme ich bei jedem Start von PB die Meldung :
"Duplicate library command: TB_IncludeFont() (in Libraries TB_IncludeFont and TB_Include)"
Einen UnInstaller bringt TailBite auch nicht mit.
Bleibt mir also wohl nur die Neuinstallation von PB oder?[/img]
Verfasst: 24.10.2004 17:10
von Falko
Die TailBite ist auf PureAranet für PB in verschiedenen Versionen enthalten.
Siehe unter folgender Tabelle auf PureArea.net
http://www.purearea.net/pb/german/proje ... Entwickler
und zwar, wo der Text "Ältere Version 1.0 für PureBasic 3.81." steht
(Sollte man vielleicht nicht installieren, wenn PB 3.90 ist).
Und wenn du Den Installer nochmal ausführst, wird damit dann auch nicht angeboten, ob du TailBite deinstalliern möchtest?
MfG Falko
Verfasst: 24.10.2004 17:11
von jear
Hallo Falko,
wahrscheinlich seh ich den Wald nicht. Nehme ich Dein Beispiel, bekomme ich schön sauber das Ergebnis als Zahlenwert zurück.
Ich muss aber Strings zurückgeben und das haut nicht hin.
Dein Beispiel, wie unten dargestellt geändert, bringt als "Ergebnis" einen Zahlenwert, den ich als irgend ein Handle interpretiere.
Definiere ich den Rückgabestring als "Global Result.s" , kennt außerhalb der DLL keiner die Variable. Definiere ich sie als "Global Result$" nutzt mir die Verwendung von Result$ im aufrufenden Teil herzlich wenig, denn das Ding ist leer.
Ich habe nun alle mir möglich erscheinenden Varianten durchgespielt.
Was mache ich falsch ????
Code: Alles auswählen
; modifiziert von jear 24.10.04
;Falko
;
;#MakeMatheDLL = 0; Wenn 0 und Option auf DLL, dann compile mathe.dll
#MakeMatheDLL = 1; Wenn 1 und Option auf Windows, dann compile Exe oder Teste mit F5
CompilerIf #MakeMatheDLL = 0
;-------------------------DLL-----------
Global Result$
ProcedureDLL.s mul(a.f,b.f)
c.f = a * b
Result$ = StrF(a,2) + " * " + StrF(b,2) + " = " + StrF(c,2)
ProcedureReturn Result$
EndProcedure;------------End------------
CompilerElse
;------------------- compile EXE oder compile/start---------
OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu ,"MakeMathe.dll")
If OpenLibrary(1,"MakeMathe.dll")
Ergebnis = CallFunction(1,"mul",20.0,20.0)
MessageRequester("Ergebnis",Str(Ergebnis) + #CRLF$ + Result$)
Else
MessageRequester("Fehler","konnte DLL nicht öffnen")
EndIf
Repeat:Until WaitWindowEvent()=#PB_EventCloseWindow
CloseLibrary(1)
CompilerEndIf
;------------------------- End--------------------------------
Verfasst: 24.10.2004 17:21
von MVXA
Das was die Prozedure zurück gibt ist der Pointer zu einem Text oder einer Zahl im RAM. die DLL sieht dann so aus:
Code: Alles auswählen
Global Result.s
ProcedureDLL.s Test(strText.s)
Result= strText
procedurereturn Result
endprocedure
im programm sieht das dann so aus:
MeinText$ würde dann "hallo" beinhalten
Verfasst: 24.10.2004 17:43
von jear
Danke LittleFurz,
so funzt es ! Leider fehlt dazu jeder Hinweis in der Hilfe.
Der geänderte Code von Falko's Beispiel steht unten. Damit bekommt man tatsächlich einen String aus einer DLL zurück.
Bleibt mein Problem mit dem TailBite. Er ist nicht zu verwenden. Gibt es andere Tools und Wege, aus diesem Beipiel eine UserLibrary zu machen?
Code: Alles auswählen
;modifiziert von jear 24.10.04
;Falko
;
;#MakeMatheDLL = 0; Wenn 0 und Option auf DLL, dann compile mathe.dll
#MakeMatheDLL = 1; Wenn 1 und Option auf Windows, dann compile Exe oder Teste mit F5
CompilerIf #MakeMatheDLL = 0
;-------------------------DLL-----------
Global Result.s
ProcedureDLL.s mul(a.f, b.f)
c.f = a * b
Result = StrF(a,2) + " * " + StrF(b,2) + " = " + StrF(c,2)
ProcedureReturn Result
EndProcedure;------------End------------
CompilerElse
;------------------- compile EXE oder compile/start---------
OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu ,"MakeMathe.dll")
If OpenLibrary(1,"MakeMathe.dll")
Ergebnis.s = PeekS(CallFunction(1,"mul", 47.0, 11.0))
MessageRequester("Ergebnis",Ergebnis)
Else
MessageRequester("Fehler","konnte DLL nicht öffnen")
EndIf
Repeat:Until WaitWindowEvent()=#PB_EventCloseWindow
CloseLibrary(1)
CompilerEndIf
;------------------------- End--------------------------------
Verfasst: 24.10.2004 18:01
von remi_meier
Für TailBite:
Geh in den Ordner Purebasic\PureLibraries\UserLibraries und entferne dort die Datei TB_Include.
Die wird wohl nicht mehr benötigt.
Verfasst: 24.10.2004 20:07
von Falko
Wahnsinn, funktioniert prächtig mit PB3.91, aber nicht mit PB3.92Beta2.
Also folgende Lib wird aus diesem PB-Code generiert, wenn unter Tools im PB - Editor TailBite angeklickt wird.
Bei mir habe ich die Datei der folgenden Lib - mul_test.pb gespeichert und eine test - library wurde automatisch dann im Userlibraryverzeichnis erstellt.
Code: Alles auswählen
Global Result$
ProcedureDLL.s mul(a.f,b.f)
c.f = a * b
Result$ = StrF(a,2) + " * " + StrF(b,2) + " = " + StrF(c,2)
ProcedureReturn Result$
EndProcedure
Danach kann man einfach in der IDE folgendes eintippen und ausführen lassen. Unten in der Infoleiste wird auch genau angezeigt, was man eingeben muß. Die Hilfe - CHM kann man dazu auch erstellen. Dazu hatte Danilo im alten Forum beschrieben, mit welchen MS-Programm das geht.
Hiermit ausführen: