2012-10-28 4 views
7

Ich versuche, zu wissen, ob das Projekt eine Bibliothek ist oder nicht, nachdem die Hilfe las ich diesen Code geschrieben, das nicht funktioniert:Wie kann ich zur Kompilierzeit feststellen, ob das Projekt ein Programm oder eine Bibliothek ist?

{$IF DEFINED(LIBPREFIX)} 
    {$DEFINE PROJECT_IS_EXECUTABLE} 
    {$UNDEF PROJECT_IS_LIBRARY} 
{$ELSE} 
    {$DEFINE PROJECT_IS_EXECUTABLE} 
    {$UNDEF PROJECT_IS_LIBRARY} 
{$IFEND} 

Ich versuchte DEFINIERT, ERKLÄRT und

{$IF (LIBPREFIX = '')} 

Jeder Versuch gibt immer das gleiche für DLLs und für Programme zurück. Wie kann ich dies nur mit integrierten Compiler-Direktiven tun?

EDIT

Meine Absicht ist es, die zusätzliche Informationen von "PE-Datei" zu entfernen.

Ich mache es direkt in .dpr Projektdatei, also egal wie die anderen Einheiten kompiliert wurden, aber ich kann das selbe nicht in DLL-Projekten machen.

Daher suchte ich einen Weg, um es in DLL-Projekten zu blockieren.

Dies ist, wie ich dieses Problem gelöst, füge ich diese Richtlinien zu meinen .dpr Programme:

{$DEFINE STRIPE_PE_INFO} 
    {$DEFINE STRIPE_RTTI} 
    {$I DDC_STRIP.inc} 

Und DDC_STRIP.inc hat alle Logik.

Antwort

11

Es gibt keine Möglichkeit, dies zu wissen, wenn Ihre Datei kompiliert wird. Eine Quelldatei kann in ein .dcu kompiliert und dann mit einem beliebigen Projekttyp verknüpft werden. Ein gutes Beispiel sind die RTL- und VCL-Einheiten.

Wahrscheinlich ist das Beste, was Sie tun können, eine Bedingung in Ihren Projektoptionen zu definieren, die angibt, ob das Projekt eine Bibliothek ist oder nicht. Sie müssen jedoch sicherstellen, dass die .dcu immer neu kompiliert wird, wenn Sie ein Projekt erstellen, das diese Einheit verwendet.

+0

Es stimmt, das macht Sinn. –

1

Das Beste, was ich mir vorstellen kann, ist eine Definition in einer Include-Datei zu definieren. Sie können eine Vorbereitungsaktion (Fledermausdatei) verwenden, um die Include-Datei zu ändern.

6

Sie können dies nicht zur Kompilierzeit feststellen, aber zur Laufzeit können Sie die SysInit.ModuleIsLib (Delphi 2007) überprüfen, um festzustellen, ob der Code in einer Bibliothek (oder einem Paket) ausgeführt wird.

+0

Für die Korrektheit ist 'System.IsLibrary' das, was Sie benötigen, um eine DLL zur Laufzeit zu erkennen. Die Frage wurde speziell zur Kompilierzeit-Erkennung gestellt, in welchem ​​Fall keine dieser Variablen geeignet ist. –

Verwandte Themen