DLL とホスト実行可能ファイルの間で Delphi オブジェクトを渡すことはできません。これは、オブジェクトが作成されたモジュールでのみオブジェクトを操作できるためです。ランタイム パッケージを使用していれば、この制限を回避できます。
フォームを作成して表示した DLL から関数をエクスポートできます。関数は次のようになります。
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
上で説明したのとまったく同じ理由で、親を Delphi オブジェクトとして渡すことはできないことに注意してください。
また、フォームの親が実行可能ファイルのコントロールになるように指定することもできません。したがって、親のウィンドウ ハンドルを渡す必要があります。
実装は次のようになります。
function ShowMyForm(ParentWindow: HWND): Pointer; stdcall;
var
Form: TMyForm;
begin
Form := TMyForm.CreateParented(ParentWindow);
Form.Show;
Result := Pointer(Form);
end;
次のように呼び出します。
Form := ShowMyForm(ScrollBox.Handle);
完了時にフォームを破棄する関数も提供する必要があります。
procedure DestroyMyForm(Form: Pointer); stdcall;
begin
TMyForm(Form).Free;
end;
また、ウィンドウの再作成に注意する必要があります。ホスト ウィンドウが再作成された場合は、子フォームを手動で再作成する必要があります。
要するに、あなたが試みていることはかなり脆弱です。私があなたなら、別のアプローチを探すでしょう。