Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c