Seite 1 von 1

DLL: Macros in Proceduren

Verfasst: 06.06.2022 16:00
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

Re: DLL: Macros in Proceduren

Verfasst: 06.06.2022 16:17
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.

Re: DLL: Macros in Proceduren

Verfasst: 06.06.2022 16:39
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.

Re: DLL: Macros in Proceduren

Verfasst: 07.06.2022 17:50
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.

Re: DLL: Macros in Proceduren

Verfasst: 09.06.2022 09:02
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

Re: DLL: Macros in Proceduren

Verfasst: 10.06.2022 18:43
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

Re: DLL: Macros in Proceduren

Verfasst: 16.06.2022 18:49
von juergenkulow