Pobieranie komponentu z DLLa.

0

Robię właśnie system pluginów do programu i napotkałem spory problem - jak przekazać do programu komponent utworzony w DLLu? Na głównej formie jest TPageControl. Podczas uruchamiania plugina jest wywoływana z niego funkcja GetTabSheet, pobierająca wskaźnik PageControla i zwracająca wskaźnik zakładki. Wygląda tak:

function GetTabSheet(PageControl: PPageControl): PTabSheet;
var Tab: TTabSheet;
begin
Tab:=TEditorTab.Create(PageControl^);
Tab.Parent:=PageControl^;
Tab.PageControl:=PageControl^;
Result:=@tab;
end;

TEditorTab to klasa zadeklarowana tylko w bibliotece (w końcu to plugin), ale jak przenosiłem wszystko do samego programu to takie tworzenie sprawowało się doskonale, więc to nie w tym problem.

Procedura w samym programie jest taka:

procedure TfrmMain.New(Sender: TObject);
var HLib: THandle;
Index: Integer;
Tab: PTabSheet;
GetTabSheet: function(PageControl: PPageControl): PTabSheet;
begin
Index:=TComponent(Sender).Tag;
HLib:=LoadLIbrary(
PChar(ExtractFileDir(Application.ExeName)+'\plugins'+PluginsArray[Index]));
@GetTabSheet:=GetProcAddress(HLib,'GetTabSheet');
Tab:=GetTabSheet(@PageControl);
FreeLibrary(HLib);
end;

A teraz najlepsze: błąd (runtime) brzmi: "Cannot assign a TFont to a TFont". To ma związek z PageControl, jak w wywołaniu procedury z biblioteki wstawiłem nil, to było cokolwiek lepiej - zwykłe access violation, bo używany wskaźnik był pusty. Czy ktoś z was spotkał się już kiedyś z takim zagadnieniem i problemem tego typu? Bo jak na mój gust, to ten kod powinien działać...

PS. Jeśli ktoś się nie domyślił: deklaracje PPageControl i PTabSheet wyglądają tak:
PPageControl = ^TPageControl;
PTabSheet = ^TTabSheet;

0

PS. Jeśli ktoś się nie domyślił: deklaracje PPageControl i PTabSheet wyglądają tak:
PPageControl = ^TPageControl;
PTabSheet = ^TTabSheet;

Po co udziwniasz?? Obiekty stworzone z klas są zawsze wskaźnikami. Tylko traktuje się je przy wywołaniach metod jak nie-wskaźniki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1