![]() |
|
|
|
|
#1
|
|||
|
|||
|
Проблема в следующем: создание и вызов формы из DLL получается, а вот создание фрейма - нет. Вот как я делаю:
В DLL: Код:
library dllClient;
uses
SysUtils,Classes, Forms,
UnitClient in 'UnitClient.pas';{Frame1: TFrame}
{$R *.res}
procedure FreeUnitClient(var Frm : TFrame); stdcall;
begin
FreeAndNil(Frm);
end;
function MakeUnitClient(AOwner:TComponent) : pointer; register;
begin
Result := TFrame1.Create(AOwner);
end;
exports
FreeUnitClient,
MakeUnitClient;В программе: Код:
procedure TForm1.sFrameBar1Items2CreateFrame(Sender: TObject; var Frame: TCustomFrame); var FrameUnitClient: TFrame; begin //Frame21Bar := TFrame2.Create(nil); //Frame := Frame21Bar; FrameUnitClient:=MakeUnitClient(nil); Frame:=FrameUnitClient; //FreeUnitClient(FrameUnitClient); end; Как правильно вызывать фреймы из DLL? Заккоментированные строки работают 100%, но этот фрейм подключен через uses.Помогите кто чем может, два дня стою на месте. |
|
#2
|
|||
|
|||
|
Ну, для начала передай туда парента, а не Nil. Ты все-рвано будешь это фрейм выкладывать на какое-то окно. Ну так и передай туда указатель на это окно.
На самом деле, скорее всего дело даже не в самом фрейме, а в компонентах на нем, а вот выясняется это именно таким сообщением (было как-то - не любят таких вещей кмпоненты с закладки Win32). |
|
#3
|
|||
|
|||
|
Делал так - не помогло:
DLL: Код:
library ... function MakeUnitClient(pn:HWND) : TFrame; stdcall; begin Result := TFrame1.CreateParented(pn); end; ... Код:
procedure TForm1.sFrameBar1Items2CreateFrame(Sender: TObject; var Frame: TCustomFrame); begin FrameUnitClient:=MakeUnitClient(sFrameBar1.ParentWindow); Frame:=FrameUnitClient; end; |
|
#4
|
|||
|
|||
|
Вот что нашел:
TFrameMy1 в DLL <> TframeMy1 в EXE DLL ничего не знает о классах определенных в главной программы EXE ничего не знает о классах определенных в DLL можно смотреть в сторону BPL и компиляции с включенным режимом buid with runtime packages, в сторону интерфейсов И что, только так? |