Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-51448
k-man
2003-09-28 22:17
2003.10.16
ЖК и все о нем


1-51259
Jeck
2003-10-07 09:34
2003.10.16
Help


3-51061
Kapitan
2003-09-26 12:55
2003.10.16
нумерация строк


3-51102
Kirill
2003-09-25 13:00
2003.10.16
Глюк TDBListBox или рук?


14-51483
Дремучий
2003-09-26 22:34
2003.10.16
Клиент форума.... но не для мастаков....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский