![]() |
|
#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, в сторону интерфейсов И что, только так? |