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.