Macro/CompilerIf Problem?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Macro/CompilerIf Problem?

Beitrag von gnasen »

Hi,

ich möchte ein projekt von mir mit DLLs zu zB C exportierbar machen.
Dafür möchte ich mir ein Macro schreiben, damit ich die Prozeduren ganz normal nutzen (und debuggen) kann, solange ich entwickle. Sobald ich das Projekt erstelle sollen dann alle "Procedure" auf "ProcedureDLL" gesetzt werden.

Dafür folgender Code der in der DLL steht:

Code: Alles auswählen

#DEBUG = #true

CompilerIf #DEBUG = #true
  Macro Procdll
    Procedure
  EndMacro
CompilerElse
  Macro Procdll
    ProcedureDLL
  EndMacro
CompilerEndIf


Procdll test()

  MessageRequester("hey",Str(#DEBUG))

EndProcedure
Und Testcode:

Code: Alles auswählen

OpenLibrary(0,"test.dll")

CallFunction(0,"test")
Wenn #DEBUG auf #true gesetzt ist, sollen alle Proceduren normal gehandhabt werden, sonst als ProcedureDLL.
Es funktioniert eigentlich auch, allerdings passiert folgendes:
Setzte ich #DEBUG auf #true oder #false, und erstelle das ganze als DLL, kann ich die Funktion mit der Testdatei aufrufen.
Ersetze ich den Code manuell mit Procedure statt ProcDLL, so funktioniert das ganze nicht.
Ich möchte nicht riskieren einen fiesen Fehler im Grundaufbau zu haben.

Bonusfrage:
Was genau macht den Unterschied zwischen ProcedureDLL und ProcedureCDLL aus? Sind ProcedureCDLL ausschließlich von C lesbar und umgekehrt kann C nur diese lesen? (Ich weiss nicht, wie ich den Satz besser formulieren soll ;) )

Schonmal ein nettes Danke an alle die sich die Mühe machen
pb 4.51
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Du kannst eigentlich alle Procedures als ProcedureDLL deklarieren und der Code müsste funktionieren. Bei ProcedureDll ist eben gegeben, dass sie "extern" sichtbar sind. In C sind alle funktionen per default als extern gekennzeichnet und daher extern aufrufbar. würdest du in C "static" davor setzen, wären die symbols nicht von aussen aufrufbar, sondern im .obj eingekapselt.

ProcedureCDLL bedeutet, dass bei Aufruf dieser Prozedur die Cdecl Aufruf-Konvention genutzt wird und bei ProcedureDLL die StdCall Konvention.
C nutzt per default die Cdecl Konvention, es muss also im C code die Funktion nicht für __sdtcall deklariert werden.

Schreibst du in PB

ProcedureDLL myprocedure()

musst du bei C sodann mit der .lib der kompilierten PB dll linken und diese so deklarieren:

int __stdcall myprocedure();


in PB jedoch

ProcedureCDLL myprocedure()

genutzt brauchst du in C sodann kein __stdcall mehr beim deklarieren:

int myprocedure();
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Du kannst sofort als ProcedureDLL schreiben und ganz nurmal aufrufen. Erst wenn diese als DLL Compiliert wird werden die Funktionen exportiert.

Der Umweg ist also nicht erforderlich.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Vielen Dank für die Antworten.
Da ich mich erstmals mit DLLs auseinandersetze, wollte ich hier nicht in versteckte Fallen tappen.

Damit sind theoretisch alle Fragen beantwortet, allerdings würde mich weiterhin interessieren was im obigen Code schiefgeht. Sieht vielleicht sogar nach einem (ganz leise geflüstert, so dass es keiner hört) kleinem Bug aus.

PS: Ist das PureBoard bei euch derzeit auch so langsam?
pb 4.51
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Setzte ich #DEBUG auf #true oder #false, und erstelle das ganze als DLL, kann ich die Funktion mit der Testdatei aufrufen.
Ersetze ich den Code manuell mit Procedure statt ProcDLL, so funktioniert das ganze nicht.
versteh nich so ganz...

also, als DLL compiliert funktioniert der externe Aufruf immer, unabhängig von #DEBUG,
und nur wenn du es manuell ersetzt kann es nicht aufgerufen werden, wie es bei #False sein sollte?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Wahrscheinlich liegt das ganze daran, dass Macros vor CompilerIf ausgewertet werden und nicht danach (PureBasic ist glaube ich auch kein singlepass Compiler mehr, kann das sein?). Desshalb ist es immer so als wäre es #TRUE.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

AH!

ja genau, sowas hab ich schon mal gesehen, und das muss dann so aussehen:

Code: Alles auswählen

Macro Procdll
  CompilerIf #DEBUG = #True
    Procedure
  CompilerElse
    ProcedureDLL
  CompilerEndIf 
EndMacro
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

okay, damit wäre auch die Frage geklärt. Gibt es eigentlich einen Abschnitt in der Hilfe, in der die komplette Prioritätenliste des Compilers steht? Fände ich ganz interessant und solch ein Fehler wie er mir unterlaufen ist, könnte verhindert werden.
Wie immer vielen Dank an alle.
pb 4.51
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Leider gibt es das nur für die üblichen Operatoren ("Variablen, Typen und Operatoren" heißt das Kapitel).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten