Initialization-Abschnitte protokollieren?
Hallo Hallo,
Kennt jemand einen Weg wie man protokollieren in welcher Reihenfolge die
Delphi-Quellcode:
-Abschnitte eines Programmes durchlaufen werden?
initialization
Ich habe hier schon eine Lösung gefunden die eine Liste erzeugt. Allerdings funktioniert diese Lösung so nicht wenn das Programm Laufzeitpackages benutzt. Dann werden nur die Units aufgelistet die direkt zum Hauptprogramm gehören. Die Units die in Packages initialisiert werden sind in der Liste nicht enthalten. Scheinbar müsste man in jeder Projektdatei jedes Laufzeitpackages diese Liste erzeugten (es sind eine Menge Packages dabei die als 3rd-Party nicht meiner Kontrolle unterliegen). Außerdem würde mich auch die Reihenfolge der Units aus statisch gelinkten Packages interessieren. Diesse werden von der obigen Lösung auch nicht erfasst. Gibt es überhaupt eine Möglichkeit so eine Protokollierung durchzuführen? Ciao, Ralf |
AW: Initialization-Abschnitte protokollieren?
Zunächst einmal würde ich mich in SysUtils
Delphi-Quellcode:
oder
LoadPackage
Delphi-Quellcode:
per Code Injection einklicken. In der eigenen Anwendung sollte das kein allzu großes Problem sein. Die Variante hätte den Vorteil, dass wir die Reihenfolge in der die BPLs geladen werden loggen können.
InitializePackage
Alternative könnte man auch einfach ein kleines Tool schreiben mit dem man die BPLs nacheinander abarbeitet. Aus
Delphi-Quellcode:
bzw.
LoadPackage
Delphi-Quellcode:
interessiert eigentlich nur das ModuleHandle. Und das bekommen wir genauso gut per
InitializePackage
Delphi-Quellcode:
.
LoadLibrary
Um es kurz (,schlampig und ungetestet) zu machen:
Delphi-Quellcode:
Jetzt nur das Beispiel anpassen:
function GetLibTypeinfo(AModule: HModule): TPackageTypeInfo;
var tmpGetInfo: GetPackageInfoTable; tmpInfo: PackageInfo; begin tmpGetInfo := GetProcAddress(tmpLib, '@GetPackageInfoTable'); tmpInfo := tmpGetInfo; Result := tmpInfo.TypeInfo; end; function GetLibTypeinfoByName(const ALibName: String): TPackageTypeInfo; var tmpLib: HModule; begin tmpLib := LoadLibrary(ALibName); Result := GetLibTypeinfo(tmpLib); FreeLibrary(tmpLib); end;
Delphi-Quellcode:
procedure TForm3.Button2Click(Sender: TObject);
var sl: TStringList; ps: PShortString; tmpInfo: TPackageTypeInfo; begin ... tmpInfo := GetLibTypeinfoByName('Meine.bpl'); ... sl := TStringList.Create; try ps := tmpInfo.UnitNames; for i := 0 to tmpInfo.UnitCount - 1 do begin sl.Add(ps^); // Move to next unit DWORD(ps) := DWORD(ps) + Length(ps^) + 1; end; Memo1.Lines.Assign(sl); finally sl.Free; end; end; Zitat:
Sollte doch Quelltext da sein, - dann könnte es schon ausreichen auch die BPls mit aktivierten Laufzeitpackages zu erzeugen. Denn dann wird (ungetestet also eigentlich sollte)die RTL bzw. der SysInit "Kram" aus der Anwendung von den BPLs verwendet werden (sonst machen diese, wie festgestellt, ihren eigenen Init "Lauf"). - könnte man auch einfach eine kleines Plugin schreiben, welches die Reihenfolge der Kompilierung protokolliert (denn in dieser sollte auch initialisiert werden). Wenn wirklich nur Units mit Init Abschnitt geloggt werden sollen, dann könnte man eben mit dem Lexer von Castalia prüfen ob einer Existiert (http://code.google.com/p/castaliadelphiparser/). Sollte auch recht schnell umgesetzt sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz