Что у меня получилось. Есть главная формочка, она умеет создавать форму, DFM-ка которой лежит в ресурсах DLL-ки:
Главная формочка
procedure TmForm.Button4Click(Sender: TObject);
var
ResForm: TsForm;
rs: TResourceStream;
ms: TMemoryStream;
rd: TReader;
tm: TMethod;
begin
rs := TResourceStream.Create( h, ResName, RT_RCDATA );
try
ms := TMemoryStream.Create;
try
ObjectTextToBinary( rs, ms );
ms.Seek( 0, soFromBeginning );
ResForm := TsForm.CreateNew( Self );
try
rd := TReader.Create( ms, 4096 );
try
RegisterClass( TsForm );
tm.Code := @SubForm.FindMethod;
tm.Data := ResForm;
rd.OnFindMethod := TFindMethodEvent( tm );
ResForm := TsForm( rd.ReadRootComponent( ResForm ) );
ResForm.ShowModal;
finally
rd.Free;
end;
finally
ResForm.Free;
end;
finally
ms.Free;
end;
finally
rs.Free;
end;
end;
Модуль с утилитами:
procedure FindMethod(Obj: TObject; Reader: TReader; const MethodName: string;
var Address: Pointer; var Error: Boolean);
begin
Address := Obj.MethodAddress( MethodName );
Error := false;
end;
Получаю формочку из DLL-ки с работающим обработчиком на кнопке.
Недостаток данного подхода следующий. Если разместить в DLL-ке как форму предка, так и пронаследованного от него потомка и попытаться получить пронаследованную форму, то форма будет пустой, без компонентов от предка.