Ersteinmal will ich mich für die viele Mühe bedanken:
Danke !!!
Zitat von
negaH:
@Mabuse:
ok, das mein obiger Code nicht sofort funktioniert ist auch logisch, ich habe ihn hier einfach aus dem gedächtnis eingehämmert, da kann man sich mal irren. Öfters komme ich mit den verschiedenen aber ähnlichen Sprachen durcheinander. Zb. gerade jetzt arbeite ich mit VHDL und dieses ist in der Syntax ähnlich wie PASCAL aber eben nicht gleich, da kostet es schon Anstrengung das if then nicht als if end if; oder das case of end; nicht als case is when end case; zu schreiben
sorry also:
Das dachte ich mir, und deshalb habe ich ihn ja angepasst, ich wollte nur wissen, ob ich es richtig gemacht habe
Zitat von
negaH:
dieser Code funktioniert bei mir super, und er extrahiert sogar noch den
Unit Namen ohne deinen Trick:
...Quellcode...
Wie du auch siehst ist die Deklaration von TEnumModuleFunc durch Borland sehr unglücklich erfolgt. Besser wäre es wie in meiner Deklaration den UserData Paramater als ersten Parameter der Callback zu benutzen. So kann man nämlich diese Callbacks ohne Probleme als Methoden-Callback eines Objectes benutzen. Dazu muß UserData eben nur Self enthalten.
Angezeigt wird zb. nachfolgendes:
Code:
TForm1 : tkClass , Project1.exe->Unit1
HWND : tkInteger , vcl70.bpl->
TOwnerDrawState : tkSet , vcl70.bpl->
TColor : tkInteger , vcl70.bpl->
EInvalidGraphic : tkClass , vcl70.bpl->Graphics
...
Bei mir zeigt er alles im Kontext von Projekt1.exe an.
Code:
Boolean : tkEnumeration , Project1.exe->
Char : tkChar , Project1.exe->
Integer : tkInteger , Project1.exe->
Byte : tkInteger , Project1.exe->
Word : tkInteger , Project1.exe->
Cardinal : tkInteger , Project1.exe->
String : tkLString , Project1.exe->
TObject : tkClass , Project1.exe->System
IInterface : tkInterface , Project1.exe->System
TOwnerDrawState : tkSet , Project1.exe->
TErrorRec : tkRecord , Project1.exe->
TExceptRec : tkRecord , Project1.exe->
TCustomVariantType : tkClass , Project1.exe->Variants
TTypeKind : tkEnumeration , Project1.exe->
TAlignment : tkEnumeration , Project1.exe->
TBiDiMode : tkEnumeration , Project1.exe->
TShiftState : tkSet , Project1.exe->
THelpContext : tkInteger , Project1.exe->
THelpType : tkEnumeration , Project1.exe->
TShortCut : tkInteger , Project1.exe->
TNotifyEvent : tkMethod , Project1.exe->
TPersistent : tkClass , Project1.exe->Classes
TInterfacedPersistent : tkClass , Project1.exe->Classes
IStringsAdapter : tkInterface , Project1.exe->Classes
TStrings : tkClass , Project1.exe->Classes
TStringItem : tkRecord , Project1.exe->
TStringList : tkClass , Project1.exe->Classes
TComponentName : tkLString , Project1.exe->
IDesignerNotify : tkInterface , Project1.exe->Classes
TComponent : tkClass , Project1.exe->Classes
TBasicAction : tkClass , Project1.exe->Classes
TIdentMapEntry : tkRecord , Project1.exe->
TColor : tkInteger , Project1.exe->
TFontPitch : tkEnumeration , Project1.exe->
TFontName : tkLString , Project1.exe->
...
THelpEvent : tkMethod , Project1.exe->
TCustomForm : tkClass , Project1.exe->Forms
TForm : tkClass , Project1.exe->Forms
TCustomDockForm : tkClass , Project1.exe->Forms
TScreen : tkClass , Project1.exe->Forms
THintInfo : tkRecord , Project1.exe->
TApplication : tkClass , Project1.exe->Forms
TForm2 : tkClass , Project1.exe->Unit2
TForm1 : tkClass , Project1.exe->Unit1
Ich versuche im Programm eine
BPL zu laden.
LoadPackage('c:\Programme\Borland\Delphi7\Bin\dclSockets70.bpl');
Diese
BPL will ich nun untersuchen.
Die erscheint in obiger Liste gar nicht, obwohl sie doch geladen wurde.
Aber ich glaube wir haben etwas aneinander vorbei geredet (geschrieben
):
Die
BPL ist
nicht in mein Programm (Listing 1. Beitrag) compiliert.
(Sie wird via TOpenDialog zur Laufzeit ausgewählt)
Mit GetPackageDescription bekomme ich die Beschreibung
(z.B. bei dclSockets70.bpl: "Borland Socket-Komponenten")
Mit GetPackageInfo bekomme ich die von dem
Package benötigten Packages
(z.B. bei dclSockets70.bpl: "rtl70.bpl")
Mit GetPackageInfo bekomme ich die von dem
Package benutzten Units (
dcu Dateien)
(z.B. bei dclSockets70.bpl: "dclsockets, SocketsReg, SysInit")
In der Callback Prozedur ermittele ich auch noch ob eine "procedure Register;" vorhanden ist
(z.B. bei dclSockets70.bpl: "SocketsReg.Register;")
Die DelphiIDE ruft diese Register Prozedur auf und initialisiert damit die Komponenten.
(z.B.
Delphi-Quellcode:
procedure Register;
begin
RegisterComponents('Internet', [TClientSocket, TServerSocket]);
end;
)
Ich will also ein beliebiges
Package öffnen und ermitteln welche Komponenten dort drin sind.
Mein Tool gibt nun folgendes aus:
Code:
Dateiname: c:\Programme\Borland\Delphi7\Bin\dclsockets70.bpl
Package Name: Borland Socket-Komponenten
Flags: 00 - benötigt
Package: rtl70.bpl
Flags: 03 -
Unit: dclsockets
Flags: 00 -
Unit: SocketsReg
SocketsReg.Register;
Flags: 00 -
Unit: SysInit
Flags: 00 - PackageName: dclsockets
Was mit fehlt ist nun das in der dclSockets70.bpl folgende Komponenten enthalten sind:
Code:
TClientSocket, TServerSocket
Hat jemand eine Idee?