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
 
#9

Re: Wie ermittelt man welche Komponenten in einem Package si

  Alt 22. Apr 2005, 06:55
Gestern hatte ich noch eine Idee, die aber auch nicht funktioniert :-/

In jedem Package (das Komponenten enthällt) gibt es eine Unit, die eine Prozedur Register enthällt.
Diese Prozedur habe ich aufgerufen
Delphi-Quellcode:
...
  case NameType of
    ntContainsUnit : begin
                          s := 'Unit: ';
                          s2 := LowerCase(Name);
                          s2[1] := UpCase(s2[1]);
                          @PRegister := GetProcAddress(PInteger(Param)^,
                            pchar('@'+s2+'@Register$qqrv'));
                          if @PRegister <> nil then
                          begin
                            s2 := name+'.Register;';
                            try
                              PRegister; // <--- hier wird Register; aufgerufen !!!
                            except
                              on E: Exception do
                                s2 := s2 + ' fehlgeschlagen ('+E.Message+')';
                            end;
                          end
                          else s2:= '';
                        end;
...
In der Register; stehen für normalerweise die RegisterComponents(...) Aufrufe
Der Aufruf schlägt natürlich fehl, weil die Prozedur RegisterComponentsProc nur in der IDE gesetzt ist, zur Laufzeit ist sie nil.
Delphi-Quellcode:
  SRegisterError = 'Ungültige Komponentenregistrierung';
...
procedure RegisterComponents(const Page: string;
  const ComponentClasses: array of TComponentClass);
begin
  if Assigned(RegisterComponentsProc) then
    RegisterComponentsProc(Page, ComponentClasses)
  else
    raise EComponentError.CreateRes(@SRegisterError);
end;
Wenn man diese Prozedur zuweist, sollte es klappen:
Delphi-Quellcode:
procedure myTestProc(const Page: string; const ComponentClasses: array of TComponentClass);
begin
  Form1.Memo1.Lines.Add(Page); // Testweise nur die Palette ausgeben
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  bak : procedure(const Page: string; const ComponentClasses: array of TComponentClass);
begin
  bak := RegisterComponentsProc;
  RegisterComponentsProc := myTestProc;
  RegisterComponents('Test hat geklappt', [TComponent]);
  RegisterComponentsProc := bak;
end;
Es wird auch 'Test hat geklappt' im Memo ausgegeben -> es funktioniert

Also habe ich das PAckage geladen, die Register Procedure aufgerufen und ein 'Ungültige Komponentenregistrierung' Fehler bekommen. Das Memo bleibt leer. Das verbiegen des Zeigers hat wohl keine Auswirkungen auf das Package.

Wie macht das Delphi?

Ich kann das Package ja in der IDE Laden, und die Komponenten werden dann brav in der Palette angezeigt.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat