Announcement

Collapse
No announcement yet.

Prüfen ob Runtime oder Designtime

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prüfen ob Runtime oder Designtime

    Hallo,

    wie kann ich im <b>Initialization</b>-Abschnitt einer Unit feststellen ob dieser Codeabschnitt zur designtime bzw. zur Runtime aufgerufen wird?

    Danke

    Torsten

  • #2
    Also, wenn eine Unit zur DesignTime ausgeführt wird muß sich ja die Unit in einem Package befinden, super. Wenn sie sich in einem Package befindet, also in einer stinknormalen DLL = Packages, dann muß ja auch ein Prozess dieses package geladen haben !? In Delphi bekommnt man über Instance = hModule das Handle auf das Packages und über MainInstance = hModule das Handle auf den Prozess. Alle Packages sind zur Design Zeit in die Delphi IDE geladen. Also muß man nur noch wissen nach welcher Signature man wo suchen muß um zu erkennen ob man zur DesignTime aufgerufen wurde. Ich nutze dafür zwei Wege:
    <li>1. GetModuleFileName(MainInstance) in 'DELPHI.EXE', 'DELPHI32.EXE'
    <li>2. GetPackageInfo() und LibModuleList<br>

    Im Fall 2. wird durch die Library Modules iteriert. Mit LibModuleList bekommt man einen Zeiger auf das erste geladene Modul. Man itereriert nun durch jedes so geladene Modul und ruft GetPackageInfo() auf. Dieser Procedure muß man eine Callback übergeben. In Dieser Callback sucht man die Unit-Namen 'HeapMon','AppMain','Browser','Verify','Compiler', 'Archiver'. Nur wenn alle vorhanden sind weiß man das es ein Modul gibt das diese Units verwendet und das MUSS der Delphi/BCB Compiler sein, sprich die IDE.<br>

    GetPackageInfo() lädt von einem Modul aus der Resource die 'PACKAGEINFO' Resource. In dieser stehen die verwendeten Units des Modules drinnen, deren Optionen usw. Wenn man mit Packages arbeitet dann wird sichergestellt das man keine zwei Packages laden kann die identische Unit-namen enthalten. Exakt über PackageInfo wird dies sichergestellt.<br>

    Gruß Hage

    Comment


    • #3
      Hallo Hagen,

      mittlerweile habe ich eine Lösung. Über Application.Exename prüfe ich auf das vorhandensein des Strings 'DELPHI'. Allerdings empfinde ich das nur als Notlösung.

      Das Ganze befindet sich nicht in einem Package, sondern in einer ganz normalen Unit und wurde für einen sehr speziellen Property-Editor benötigt.

      Gruß

      Torste

      Comment


      • #4
        Aber worin wird die Unit installiert ? Jeder ProeprtyEditor aus einer Unit muß über ein Package in die IDE installiert werden. Deshalb kannst du auch mit Application.ExeName nach 'DELPHI' suchen ! D.h. mein obiger Vorschlag mit GetModuleFilename(MainInstance,...) ist fast identisch mit Application.ExeName = ParamStr(0).<br>

        Am sichersten und eben auch unabhängig vom Umbenennen von DELPHI32.EXE/BCB32.EXE ist eben mein zweiter Vorschlag. Findet man ein geladenes Packages über die LibModuleList das in deren PACKAGEINFO Resource die oben genannten Units verwendet dann muß es das IDE-Compiler Package von Delphi eg. BCB sein.
        Wenn nun dieses Package geladen ist dann heisst dies das der dahinter stehende Prozess NUR Delphi32.exe oder BCB32.exe sein kann, denn NUR diese Original Borland Programme können das IDE-Compiler Package laden, dies hat Borland sichergestellt. Einseits technologisch und andererseits durch Lizenzrechte.

        Ein "Angreifer" der deine Unit in seinem Program illegal verwenden wollte, muß ein Schummel-Package laden das in dessen PACKAGEINFO eben obige Units einbindet. Allerdings dürfte dies sehr schwer fallen, denn 1.) muß das der "Angreifer" wissen und 2.) müsste er aus dem jeweilige Schummel-Package manuell die PACKAGEINFO Tabelle entfernen und durch seine eigene ersetzten. Macht er genau dies bekommt er aber Probleme beim Laden des Packages, denn die PACKAGEINFO Resource hat Einfluß auf den Initialisierungscode des Packages beim Laden des selbigen. Man könnte noch weitere Tricks anwenden um das Ganze noch sicherer zu machen.

        Gruß Hage

        Comment


        • #5
          Hallo Hagen,

          vielen Dank für die Info's. Meine Notlösung bereitet mir mit Blick auf die Zukunft schon ein wenig Bauchschmerzen. Ich werde mir mal Deinen 2. Vorschlag anschauen.

          Mit dem Package hast Du wie meistens Recht.

          Gruß

          Torste

          Comment

          Working...
          X