Library-Programmierung: Nur Windows-DLLs ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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?
Benutzeravatar
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:

Beitrag 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--------------------------------
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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]
Benutzeravatar
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:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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--------------------------------
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

MeinText$ = peeks(CallFunction(1,"test","hallo"))
MeinText$ würde dann "hallo" beinhalten
Bild
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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--------------------------------
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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.
Benutzeravatar
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:

Beitrag 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:

Code: Alles auswählen

test.s=mul(20.0,20.0)
Debug test
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten