Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

Re: Wie ermittelt man welche Komponenten in einem Package si

  Alt 22. Apr 2005, 14:35
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?
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat