DLL: Macros in Proceduren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Blitzer
Beiträge: 79
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

DLL: Macros in Proceduren

Beitrag von Blitzer »

Hallo,

innerhalb von Proceduren lassen sich Macros wunderbar definieren.

Wird aber eine Procedure in eine DLL geschrieben, lassen sich diese Macros nicht benutzen.

Die 'ProcedureDLL MyFunction()' und das 'Macro XCase' sind die Beispiele aus der Hilfe...

Code: Alles auswählen

; Einzelnes Programm
Procedure MyFunction()
  MessageRequester("Hallo", "Dies ist eine PureBasic DLL !", 0)
    
  Macro XCase(Type, Text)
    Type#Case(Text)
  EndMacro
    
EndProcedure
  
  CallFunction(0, "MyFunction")
  
  Debug XCase(U, "Hello")
  Debug XCase(L, "Hello")

Code: Alles auswählen

; Nur für die Erzeugung der DLL 
ProcedureDLL MyFunction()
  MessageRequester("Hallo", "Dies ist eine PureBasic DLL !", 0)
    
  Macro XCase(Type, Text)
    Type#Case(Text)
  EndMacro
    
EndProcedure

Code: Alles auswählen

; Das aufrufende Programm
If OpenLibrary(0, "MyFunction.dll")
  CallFunction(0, "MyFunction")
  
  Debug XCase(U, "Hello")
  Debug XCase(L, "Hello")
  
CloseLibrary(0)
EndIf

Gibt es eine Lösung, um Macros in DLL's unterzubringen?

Blitzer
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: DLL: Macros in Proceduren

Beitrag von NicTheQuick »

Nein, du hast nicht ganz verstanden wie Macros funktionieren. Macros werden vom Compiler aufgelöst bevor überhaupt kompiliert wird. Sie existieren nicht mehr im Kompilat. Sie funktionieren wie eine Art Suchen/Ersetzen-Dialog, um es vereinfacht auszudrücken.
Bild
Blitzer
Beiträge: 79
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Re: DLL: Macros in Proceduren

Beitrag von Blitzer »

Ja möglich, dass ich da was nicht ganz verstanden habe. In der Hilfe zu Macros steht:
Ein Makro ist ein Platzhalter für etwas Code (ein Schlüsselwort, eine Zeile oder auch viele Zeilen), welcher (beim Kompilieren) direkt an der Stelle, wo das Makro aufgerufen wird, in den Programmcode eingefügt wird.
... beim Kompilieren ... ersetzt ... Also gibt es keine Lösung, um Macros von extern einzubinden. Wie schade.
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: DLL: Macros in Proceduren

Beitrag von Benubi »

Macros werden nicht nach außen exportiert, sie werden vom Präprozessor zu Code umgewandelt der dann "inline" kompiliert wird. Du mußt daher deine Makros mit deinem DLL Code definieren.

Die Zeile "

Code: Alles auswählen

Debug XCase(U, "Hallo")
wird vom Kompiler so umgeschrieben und kompiliert:

Code: Alles auswählen

Debug UCase("Hallo")
Macros werden nicht zur Laufzeit aufgerufen, sie werden vor dem kompilieren verarbeitet.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: DLL: Macros in Proceduren

Beitrag von juergenkulow »

Code: Alles auswählen

; Macro und DLL/Shared 
Macro XCase(Type, Text)
  Type#Case(Text)
EndMacro; Das aufrufende Programm


If OpenLibrary(0, "MyFunction.dll") Or OpenLibrary(0, "/tmp/MyFunction.so")
  CallFunction(0, "MyFunction")
  
  Debug XCase(U, "Hello")
  Debug XCase(L, "Hello")
  
  CloseLibrary(0)
Else
  Debug "Konnte MyFunction.dll oder /tmp/MyFunction.so nicht öffnen."
EndIf
; 1. Meldung Hallo - Dies ist eine PureBasic DLL !
; 2.HELLO
; hello
Erzeugt mit der der Command-Line Option ; -pp <file>

Code: Alles auswählen

Macro XCase(Type, Text)
  Type#Case(Text)
EndMacro
If OpenLibrary(0, "MyFunction.dll") Or OpenLibrary(0, "/tmp/MyFunction.so")
  CallFunction(0, "MyFunction")
Debug UCase("Hello")
Debug LCase("Hello")
  CloseLibrary(0)
Else
  Debug "Konnte MyFunction.dll oder /tmp/MyFunction.so nicht öffnen."
EndIf
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Blitzer
Beiträge: 79
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Re: DLL: Macros in Proceduren

Beitrag von Blitzer »

Ähmmm... -pp?
Erzeugt mit der der Command-Line Option ; -pp <file>
Habe ich wieder was verschlafen, oder ist es vom Freebasic FBC64:
-pp Write out preprocessed input file (.pp.bas) only
Wer weiß Rat?
Blitzer
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: DLL: Macros in Proceduren

Beitrag von juergenkulow »

Antworten