Fragen zu Structuren & Procedure[DDL]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Fragen zu Structuren & Procedure[DDL]

Beitrag von Deluxe0321 »

Hey!
Ich habe vor ein kleines Pluginsystem zu schreiben. Habe mir ein kleines Programm geschrieben das mir Youtube-Videos läd und dann mit ffmpeg in mp3s umwandelt. Da ich jetzt noch andere Cliphoster hinzufügen will dachte ich an die Pluginlösung in Form vom DLL's.

Ich habe jetzt zu dem Thema 2 Fragen.

1. Ich kann in Structuren keine Pointer verwenden. Denn

Code: Alles auswählen

Structure Event
  *Pointer
  a.i
  b.i
EndStructure
Event.Event
Event\*Pointer = @Fiktivefunktion()
ist ja nicht möglich. Kann ich unbedenklich als Pointer eine Interger, also *.i verwenden?

2. Ich habe mal ein wenig mit DLL's herumgespielt. Mal ein kleines Bsp:

Code: Alles auswählen


;---- DLL

Structure Event
  Pointer.i
  a.i
  b.i
EndStructure

Procedure RegisterEvent()
  MessageRequester("LOL?","hello, from DLL ;)",0)
EndProcedure

ProcedureDLL Reg(*in.Event)
  *in\Pointer.i = @RegisterEvent()
  *in\a.i = 123
  *in\b.i = 456
EndProcedure

Code: Alles auswählen


;----EXE

Structure Event
  Pointer.i
  a.i
  b.i
EndStructure    
 
Event.Event    
    
If OpenLibrary(0, "asd.dll")

  *Regev = GetFunction(0, "Reg")
  If *Regev
    CallFunctionFast(*Regev, @Event)
  EndIf
  
  ;Debug Event\Pointer.i
  CallFunctionFast(Event\Pointer.i)

  CloseLibrary(0)
EndIf
Wie man im Code sehen kann rufe ich aus der Exe eine Funktion der DLL aus die NICHT mit ProcedureDLL deklariert ist. :D Darf man das? Bestehen dadurch Risiken einen absturzes?

Schonmal danke für die Hilfe
Grüße Marv
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Zu 1:
bei Verwendung der Structure darf das * nicht mitgeschrieben werden:

Code: Alles auswählen

Procedure Fiktivefunktion()
EndProcedure
Structure Event
  *Pointer
  a.i
  b.i
EndStructure
Event.Event
Event\Pointer = @Fiktivefunktion()
Zu 3:
kannste problemlos machen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Little John

Beitrag von Little John »

ts-soft hat geschrieben:Zu 1:
bei Verwendung der Structure darf das * nicht mitgeschrieben werden:

Code: Alles auswählen

Procedure Fiktivefunktion()
EndProcedure
Structure Event
  *Pointer
  a.i
  b.i
EndStructure
Event.Event
Event\Pointer = @Fiktivefunktion()
Da bin ich auch schon mal drüber gestolpert. Das ist ein Widerspruch zur Dokumentation.
Denn im Kapitel "Zeiger und Speicherzugriff" der Hilfe zu PB 4.30 steht:
Hinweis: Anders als in C/C++ ist in PureBasic der * immer Teil des Variablennamens. Damit sind *ptr und ptr zwei verschiedene Variablen. ptr ist eine (reguläre) Variable zum Speichern eines Werts, *ptr ist eine andere Variable vom Typ Zeiger zum Speichern einer Adresse.
Das Wort "immer" habe nicht ich fett geschrieben, sondern so steht es in der Hilfe!

Gruß, Little John
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag von Deluxe0321 »

danke für die Antworten ^^
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

ts-soft hat geschrieben:Zu 3:
kannste problemlos machen
Bist du dir sicher? Gibs da ne Quelle, weil ... ich möcht jetzt nicht
deswegen ne Stunde die MSDN durchsuchen :D

... in der PB-Hilfe ist lediglich von Variablen die rede, aber nicht von
Strukturelementen, allerdings werden Strukturelemente leider nirgends wo
erwähnt, weshalb da wohl (fast) jeder von uns drüber gestolpert ist. :?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PMV hat geschrieben:
ts-soft hat geschrieben:Zu 3:
kannste problemlos machen
Bist du dir sicher? Gibs da ne Quelle, weil ... ich möcht jetzt nicht
deswegen ne Stunde die MSDN durchsuchen :D
Wenn Du eine DLL lädtst, ist der Speicher mit Deiner Exe geshared, Du
kannst also Problemlos alle Proceduren aufrufen, deren Adresse Du hast.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten