DLL und (globale) Variable

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

DLL und (globale) Variable

Beitrag von ProgOldie »

Für DLLs gelten ja vor allem zwei Regeln:
1. Keine Wertzuweisungen außerhalb von ProcedureDLLs
2. Strings müssen als Global deklariert werden.

Zwei Fragen dazu:
a) Kann man in der DLL Strukturen definieren, auf die man von außen zugreifen kann?
b) Kann man Variable (z.B. Integer oder Float) in der DLL definieren, auf die man von außen zugreifen kann?

Konstruiertes Beispiel:

Code: Alles auswählen

Structure Person
  Vorname.s
  Nachname.s
  Wohnort.s
  Alter.i
EndStructure

Global Altersgrenze.i, Standardwohnort.s

ProcedureDLL setGrenzalter(Altersvorgabe.i)
 Altersgrenze=Altersvorgabe
EndProcedure

ProcedureDLL setStandardwohnort(Ort.s)
 Standardwohnort=Ort
EndProcedure

ProcedureDLL setWohnort(*P.Person)
  *P\Wohnort=Standardwohnort
EndProcedure
Sind dann syntaktisch richtige DLL-Aufrufe wie

Code: Alles auswählen

setGrenzalter(18)
setStandardwohnort("Köln")
Define Person1.Person
Person1\Wohnort=Standardwohnort
Person1\Alter=Grenzalter
auch im Hinblick auf Speicher unproblematisch?
Oder sind Probleme mit STRUCTURE Person zu erwarten, wenn die Struktur nur innerhalb der (übersetzten) DLL definiert ist, aber von außen aufgerufen wird? Muss man sie dann im Hauptprogramm noch 'mal definieren?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: DLL und (globale) Variable

Beitrag von Sicro »

ProgOldie hat geschrieben:a) Kann man in der DLL Strukturen definieren, auf die man von außen zugreifen kann?
Ja.

DLL:

Code: Alles auswählen

Structure Person
  Vorname.s
  Nachname.s
  Wohnort.s
  Alter.i
EndStructure

Global P.Person

ProcedureDLL.i GetPersonDataPointer()
  ProcedureReturn @P
EndProcedure
Programm:

Code: Alles auswählen

Structure Person
  Vorname.s
  Nachname.s
  Wohnort.s
  Alter.i
EndStructure

If OpenLibrary(0, "MeineDLL.dll")
  Debug "ok"
  
  ; Daten setzen
  *P.Person = CallFunction(0, "GetPersonDataPointer")
  If *P
    *P\Vorname  = "Kevin"
    *P\Nachname = "Müller"
    *P\Alter    = 30
    *P\Wohnort  = "Stuttgart"
  EndIf
  
  ; Daten auslesen
  *P.Person = CallFunction(0, "GetPersonDataPointer")
  If *P
    Debug *P\Vorname
    Debug *P\Nachname
    Debug *P\Alter
    Debug *P\Wohnort
  EndIf
EndIf
ProgOldie hat geschrieben:b) Kann man Variable (z.B. Integer oder Float) in der DLL definieren, auf die man von außen zugreifen kann?
Entweder du stellst dafür ProcedureDLLs zur Verfügung:

Code: Alles auswählen

Global Variable.i

ProcedureDLL SetValue(value.i)
  Variable = value
EndProcedure

ProcedureDLL.i GetValue()
  ProcedureReturn Variable
EndProcedure
oder du gibst dem Programm die Adresse der Variable bekannt und greifst dann über diese zu:

DLL:

Code: Alles auswählen

Global Variable.f

ProcedureDLL GetVariablePointer()
  ProcedureReturn @Variable
EndProcedure
Programm:

Code: Alles auswählen

If OpenLibrary(0, "MeineDLL.dll")
  Debug "ok"
  
  *variable = CallFunction(0, "GetVariablePointer")
  PokeF(*variable, 10.5)
  Debug PeekF(*variable)
  
  ; Oder:
  
  *variable2.Float = CallFunction(0, "GetVariablePointer")
  *variable2\f = 10.5
  Debug *variable2\f
EndIf
Bei Float- und Double-Variablen funktioniert die erste Methode nicht.


Noch ein Beispiel für String-Variablen:

DLL:

Code: Alles auswählen

Global Variable.s

ProcedureDLL.s GetText()
  ProcedureReturn Variable
EndProcedure

ProcedureDLL SetText(Text.s)
  Variable = Text
EndProcedure
Programm:

Code: Alles auswählen

If OpenLibrary(0, "MeineDLL.dll")
  Debug "ok"
  
  CallFunction(0, "SetText", @"Ein Test")
  Debug PeekS(CallFunction(0, "GetText"))
EndIf
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: DLL und (globale) Variable

Beitrag von ProgOldie »

Super, danke für die Mühe, Sicro! Das ist genau das, was ich brauche.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten