Hallo Christian!
Für mich schaut das arg nach "durch den Zeh eine Hirnoperation vorgenommen" aus.
Nette Umschreibung. Aber womöglich ist der Weg nicht ganz so weit. Ich hab das halt einfach mal gemacht (nur ganz einfach) und kann nur sagen: "Es hat geklappt!".
Hier der Delphicode für die DLL:
Code: Alles auswählen
library Formdll;
 
uses
  Forms,
  FormularDll in 'FormularDll.PAS' {DllForm};
 
{$R *.RES}
 
exports
  ZeigDich;
 
begin
end.
Hier der Delphicode für das Formular:
Code: Alles auswählen
unit FormularDll;
 
interface
 
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ComCtrls, OleCtrls, ExtCtrls, Buttons;
 
type
  TDllForm = class(TForm)
    BitBtn2: TBitBtn;
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  DllForm: TDllForm;
 
{$ifdef WIN32}
procedure ZeigDich;
{$else}
procedure ZeigDich; export;
{$endif}
 
implementation
 
{$R *.DFM}
 
 
Procedure ZeigDich;
begin
  DllForm := TDllForm.Create(Application);
  DllForm.Show;
end;
 
procedure TDllForm.BitBtn2Click(Sender: TObject);
begin
  DllForm.Release;
end;
 
end.
Hier der Lazaruscode für das Project:
Code: Alles auswählen
program project1;
 
{$mode objfpc}{$H+}
{$R *.res}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, Unit1;
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Hier der Lazaruscode für das aufrufende Formular:
Code: Alles auswählen
unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, TypInfo, Forms, ExtCtrls,
  AvgLvlTree, LCLType, LCLProc, LCLIntf, LResources, GraphType, Graphics, Menus,
  ActnList, ClipBrd, Controls, Buttons, Windows;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
  aWnd : Hwnd;
  WPM : TWindowPlacement;
 
procedure ZeigDich;
 
implementation
 
{ TForm1 }
procedure ZeigDich; external 'FORMDLL';
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ZeigDich;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;
 
 
 
 
initialization
  {$I unit1.lrs}
 
end.
Ich hänge da mal ein Bildchen an. 
Es wäre echt schade wenn keiner was macht weil es halt Windows spezifisch ist und Windows spezifisches für Lazarus links liegen bleibt. Ja stell Dir vor es gibt Freibier und keiner geht hin. Ich probiere das mal weiter bis ich im Hirn bin und lass den Sinn erst mal aussen vor.
Tschüsss!