Все разрешилось! Ура!
Вот код:
(пока решал немного переделал)
Данный код можно использовать для создания своих таких программ! При этом, как обычных, так и MDI !!!
Основная программа:
Код:
type
TPlugInfo = record
Caption: TCaption;
Hint: String;
end;
IPInt = interface
['{85022A81-9BA8-4B23-815D-C25B03432E6A}']
function GetInfo: TPlugInfo;
end;
TPComp = class(TComponent)
end;
TPCompClass = class of TPComp;
...............................................
public
hPack: array of HMODULE;
end;
...............................................
// Процедура поиска и загрузки плагинов
procedure TMainForm.LoadPlugins;
function NewPlugMenuItem(const ACaption, AHint, AName: string;
AOnClick: TNotifyEvent): TMenuItem;
begin
Result := TMenuItem.Create(nil);
with Result do
begin
Caption := ACaption;
Hint := AHint;
Name := AName;
OnClick := AOnClick;
end;
end;
var
I: Integer;
PluginsList: TStringList;
PComp: TPComp;
PCompClass: TPCompClass;
PInt: IPInt;
PlugInfo: TPlugInfo;
begin
PluginsList := TStringList.Create;
try
PluginsList := FindPlugins(ExtractFilePath(Application.ExeName));
PluginsList.Sort;
SetLength(hPack, PluginsList.Count);
for I := 0 to PluginsList.Count - 1 do
begin
PComp := nil;
PInt := nil;
hPack[i] := LoadPackage(PluginsList[i]);
if hPack[i] > 0 then
begin
PCompClass := TPCompClass(GetClass('TPC'));
if Assigned(PCompClass) then
begin
PComp := PCompClass.Create(Self);
PComp.GetInterface(IPInt, PInt);
PlugInfo := PInt.GetInfo;
try
mmComponents.Add(NewPlugMenuItem(PlugInfo.Caption, PlugInfo.Hint,
'PM' + IntToStr(I), OpenPluginForm));
finally
PComp.Free;
UnRegisterClass(GetClass('TPC'));
end;
end;
end;
end;
finally
PluginsList.Free;
end;
end;
// Процедура вызова плагина
procedure TMainForm.OpenPluginForm(Sender: TObject);
var
PackForm: TForm;
FormClass: TFormClass;
begin
FormClass := TFormClass(GetClass(TMenuItem(Sender).Hint));
if Assigned(FormClass) then
begin
PackForm := FormClass.Create(Self);
PackForm.Show;
end
else
raise Exception.Create(
'Ошибка! Неудалось открыть окно плагина. Класс не найден.');
end;
Плагин:
Код:
type
TPlugInfo = record
Caption: TCaption;
Hint: String;
end;
IPInt = interface
['{85022A81-9BA8-4B23-815D-C25B03432E6A}']
function GetInfo: TPlugInfo;
end;
TPC = class(TComponent, IPInt)
public
function GetInfo: TPlugInfo;
end;
..........................
{ TPC }
function TPC.GetInfo: TPlugInfo;
begin
Result.Caption := 'Тестовый';
Result.Hint := 'TTestForm';
end;
initialization
RegisterClass({Та форма из плагина (главная), которую будем грузить при его вызове});
RegisterClass(TPC);
Пользуйтесь на здоровье!!!
))))))))))))))))))