Library-Programmierung: Nur Windows-DLLs ?
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?
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?
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
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
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--------------------------------
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
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]
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]
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
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
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
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 ????
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--------------------------------
Das was die Prozedure zurück gibt ist der Pointer zu einem Text oder einer Zahl im RAM. die DLL sieht dann so aus:
im programm sieht das dann so aus:
MeinText$ würde dann "hallo" beinhalten
Code: Alles auswählen
Global Result.s
ProcedureDLL.s Test(strText.s)
Result= strText
procedurereturn Result
endprocedure
Code: Alles auswählen
MeinText$ = peeks(CallFunction(1,"test","hallo"))
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?
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--------------------------------
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
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.
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:
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
Hiermit ausführen:
Code: Alles auswählen
test.s=mul(20.0,20.0)
Debug test