Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

MDI окошко в DLL ке   Найти похожие ветки 

 
dnsokol ©   (2003-09-25 10:10) [0]

Привет Алл! Собственно возник вопросик следующего плана - есть MDI приложение. Написал длл, в котором лежит формочка для этого приложения - как заставить эту формочку грузиться как MDIChild? Делаю вот так:
Application.Handle := StrToInt(cfg.value[0]); // сюда пытался тыкать как HWND главного окна, так и самого HOST Application - результат один и тот же :(
Application.CreateForm(TFormShowLic, FormShowLic);
FormShowLic.ParentWindow := StrToInt(cfg.value[0]);
FormShowLic.FormStyle := fsMDIChild;
вылетаем с ошибкой: Cannot create form. No MDI forms cerrently active :(
Собственно интересует что не так?


 
clickmaker ©   (2003-09-25 12:15) [1]

MDI формочку создавай в приложении, грузи DLL, в ней создавай TFrame cо всем содержимым, которое тебе нужно на MDIChild, возвращай указатель на этот фрейм и скажи Frame.Parent := MDIChild


 
dnsokol ©   (2003-09-25 13:05) [2]

трабл с Cannot create form. No MDI forms cerrently active :(
разрулил путем передачи указателя на Application приложения, с последующим сожранением Application длл"ки в временную переменную, затем создаём формочку и возвращаем Application длл"ки в прехнее значение. трабла появилась следующая:
if not assigned(DLL_App) then
begin
DLL_App := Application;
Application := HostApp;
end;
Application.CreateForm(TFormShowLic, FormShowLic);
Dispose(Pointer(cfg));
ShowMessage("All setup ok!");
в выделеном фрагменте вываливаемся с еррором: Access violation in adress XXX :( куды дальше копать?


 
Amoeba   (2003-09-25 18:37) [3]

А что есть cfg?


 
Ketmar ©   (2003-09-25 19:19) [4]

ShareMem не забыто?


 
Doid ©   (2003-09-25 19:23) [5]

Попробуй так (вместо твоей выделенной строки):

FormShowLic := TFormShowLic.Create(Application.MainForm);

(у MDI-Child`а должен быть указан Owner)


 
Yuri-7 ©   (2003-09-25 19:58) [6]

где-то скачал, но работает

DLL
------
library ProjectDll;

uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
UnitDll in "UnitDll.pas" {Form1};

procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
var
Form1: TForm1;
DllProc: Pointer; { Called whenever DLL entry point is called }
begin
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
Form1.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

exports
ProvaChild;

begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.
//----------------------------------
unit UnitDll;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyParentForm: TForm;
MyParentApplication: TApplication;
end;

var
DllApplication: TApplication;

implementation

{$R *.DFM}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// Application:=DllApplication;
end;

end.
//*****************************************
//Вызывающее приложение
//--------------------
program MainProject;

uses
Forms,
MainUnit1 in "MainUnit1.pas" {MainForm};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
//---------------------
unit MainUnit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ToolWin, ComCtrls, Menus;

type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
Start: TMenuItem;
procedure StartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.StartClick(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
begin
DllHandle := LoadLibrary("ProjectDll");
ProcAddr := GetProcAddress(DllHandle, "ProvaChild");
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
end;
end;

end.


 
dnsokol ©   (2003-09-25 22:06) [7]

To Amoeba cfg - указатель на структуру, в котой храняться необходивые зля работы длл "исходные" данные.
To Ketmar :[..] я так полагал, что данная фишка нужна только если я хочу напрямую в длл стринги пулять, а я обхожусь пчарами и указателями :)
To Doid - монопенесуально :(
Попробую воспользоваться советов Ketmar"a - чем чёрт не шутит. о результатах сообщу :)


 
Kova   (2003-09-26 13:50) [8]

Для того, чтобы создать в MDI дочернее окно необходимо отравить сообщение WM_MDICREATE. Посмотри исходники Delphi, там есть создание дочерних окон.


 
DNSokol ©   (2003-10-04 10:07) [9]

Вот мой код - интересно - где грабли:
Процедура хост окошка:
plugin := plugins.Items[Tag];
info := plugin.NeedData;
new(NeedData);
parser(info,NeedData);
FillNeedData(NeedData,(Sender as TAction).Tag);
plugin.SetupProc(NeedData);
plugin.RunProc;
Dispose(Pointer(NeedData));

Сама DLL:

procedure RunWindow; stdCall;
begin
if not assigned(FormShowLic) then
begin
FormShowLic := TFormShowLic.Create(Application.MainForm);
FormShowLic.Show;
end
else
FormShowLic.SetFocus;
end;

procedure CloseWindow; stdCall;
begin
FormShowLic.Release;
FormShowLic := nil;
end;

procedure SetupWindow(cfg : PNeedData); stdCall;
begin
if not assigned(DLL_App) then
begin
DLL_App := Application; //Application;
MainF := @(cfg.ValuePtr[1]);
Application := @(cfg.ValuePtr[0]);
end;
end;

function GetNeedData: PChar; stdCall;
begin
result := PChar("APP_POINTER,MF_POINTER,APP_HANDLE,MY_TAG,CONNECTION_HANDLE,MAIN_HANDLE,");
end;

procedure MyDLLProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then
if Assigned(Dll_App) then Application := Dll_App;
end;
Структура NeedData:
TNeedData = record
Parameter : array of PChar;
ValueStr : array of PChar;
ValuePtr : array of Pointer;
end;
PNeedData = ^TNeedData;
Вылет с ерроком: Project XXX.exe raised exception class EAccessViolation with message "Access violation at adress XXXXX in module XXX.dll. Read of address XXXXX"


 
DNSokol ©   (2003-10-04 16:23) [10]

АУ! Народ! Неужели никто не знает как с этим бороться?



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
14-51477
SDF
2003-09-29 13:10
2003.10.16
Ищу линк на дистриб 7 дельфы.


14-51486
wl
2003-09-28 21:30
2003.10.16
где лежат клиенты форумов?


1-51255
ghost_by
2003-10-03 13:20
2003.10.16
TStringGrid - как запретить редактирование отдельных ячеек?


1-51275
sosiska
2003-10-06 21:13
2003.10.16
Метка диска


3-51110
Ru
2003-09-24 11:07
2003.10.16
How get data from BLOB Fields?