Seite 1 von 1

Fragen zu Structuren & Procedure[DDL]

Verfasst: 20.02.2009 17:14
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

Verfasst: 20.02.2009 17:51
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

Verfasst: 20.02.2009 20:12
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

Verfasst: 20.02.2009 20:50
von Deluxe0321
danke für die Antworten ^^

Verfasst: 21.02.2009 10:10
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

Verfasst: 21.02.2009 10:33
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.