Delphi - MDIChild Form elhelyezése DLL-be

forráskód letöltése
Múlt héten a "Form elhelyezése DLL-ben" című cikkben azt vizsgáltuk, hogy miként használhatunk fel egy alkalmazásban egy olyan ablakot, mely egy DLL-ben kapott helyet.

Most azt nézzük meg, hogy mi a teendő, ha ez az ablak egy speciális MDI Child Form. A mellékelt DLL könyvtárban lévő Project2-t fordítsa le és a létrejött Project2.dll állományt másolja át az EXE könyvtárba, mielőtt az ott található programot futtatná.

Hasonlóan a múlt heti megoldáshoz, most is egy ShowForm nevű eljárást hozunk létre az ablak megjelenítéséhez. Most viszont nem elegendő létrehozni azt, hanem szükség van némi varázslatra.

A ShowForm eljárásunknak most két paramétert is át kell majd adnunk. Az egyik a hívó alkalmazás, TApplication típusban, a másik a MDIForm ablak TForm típusban.

A helyes működés érdekében a DLL Application változójának értékül kell adnunk a paraméterként kapott értéket, ezzel mintegy átverjük a DLL-t, mely most azt hiszi, hogy az EXE és saját maga is egy és ugyanaz az alkalmazás.

A MDI Child ablak létrehozásánál pedig a tulajdonosnak a paraméterként kapott MDI Form ablakot kell megadnunk.
procedure ShowForm(app: TApplication; mdi: TForm);
begin
  Application:=app;
  Form2:=TForm2.Create(mdi);
  Form2.Show;
end;
Létre kell hoznunk még egy speciális DLL eljárást is, mely akkor kerül meghívásra, ha a DLL-ünk betöltődik, illetve megszűnik. Utóbbi esetben vissza kell állítanunk a DLL Application változóját az eredeti értékre. Ehhez persze tudnunk is kell azt, ezért a DLL inicializáló kódjában eltároljuk az eredetit egy FOldApplication változóba.
begin
  FOldApplication:=Application;
  DLLProc:=@LibraryProc;
end.
Ugyanitt értékül is adjuk a saját eljárásunkat a DLLProc változónak. Ennek meghívásakor pedig visszaállítjuk az eredeti értéket.
procedure LibraryProc(Reason: Integer);
begin
  if Reason=DLL_PROCESS_DETACH then begin
    Application:=FOldApplication;
  end;
end;
A DLL felhasználása az EXE-ből már ugyanúgy történik, mint a múlt heti példában.