Текущий архив: 2004.02.13;
Скачать: CL | DM;
Вниз
как создать MDIChild окно, находящейся в DLL? Найти похожие ветки
← →
Saracin (2004-02-01 15:50) [0]В dll"ке сделал функцию типа
void CreateWindow(HWND hApp){
Application->Handle = hApp;
Form2 = new TForm2->Create(Application);
Form2->Show();
}
Если Form2 это обычное окно, то все работает. Если же оно MDIChild то выдает исклиючение с сообщзением: "Cannot скуфену form.No MDI forms are currently active". Подрузомеваю проблему с тем что у dll и у exe разные Application. Я попробывал передать в функцию TApplication* App и в теле написал Application = App; окно создается, но в главной форме теперь MDIChildCount всегда равно 0, а внутри dll у Application->MainForm->MDIChildCount работает нармально. Вообщем как быть не представляю :(.
С Уважением Saracin.
← →
Saracin (2004-02-01 16:32) [1]Да еще фича :) если в dll"ку поместить не форму а фрейм и в функеции написать типа:
CreateFrame(TForm* fmParent){
Frame1 = new TFrame1(fmParent);
Frame1->Parent = fmParent;
}
тогда на последнем присваивании кричит что не может преобразовать TFont к TFont :))
P.S. На Frame Не чего нет, он покрашен в красный цвет.
P.S. Ошибка типа runtime error.
← →
Saracin (2004-02-01 17:05) [2]Вот что говорит Borland по даной теме :)
http://bdn.borland.com/article/0,1410,20877,00.html
С Уважением Saracin
← →
Юрий Зотов (2004-02-01 17:53) [3]Компилируйте EXE и DLL с run-time пакетами (либо делайте BPL вместо DLL) - не будет никаких проблем.
← →
Saracin (2004-02-01 18:02) [4]хех с ума сойти :))) ведь была такая мысль и даже проверял ее :) но раньше почему то не прошло. Сейчас прошло. Раньше видимо уверености не зватало :)) был бы весьма признатеен если бы объяснили в чем суть дела.
С Уважением Saracin
← →
Юрий Зотов (2004-02-01 18:41) [5]> Saracin © (01.02.04 18:02) [4]
При обычной компиляции EXE и DLL строятся, как два совершенно раздельных проекта, которые ничего друг о друге не знают. Соответственно, в каждом из них будут существовать свои собственные экземпляры глобальных объектов (Screen, Application, Mouse, Clipboard, Session и др.), в каждом из них любой один и тот же класс (например, TFont) тоже будет своим собственным классом - и т.д. В итоге нарушается нормальная работа VCL и что из этого получится - неизвестно даже Borland"у. Ясно только, что ничего хорошего не выйдет.
А вот при компиляции с run-time пакетами и EXE, и DLL будут использовать ОБЩИЕ пакеты, в которых, собственно, вся VCL и сидит. В итоге все работает номально.
← →
Yuri-7 (2004-02-02 22:41) [6]Привожу полностью проекты для вызова MDIChild окон из DLL.
Вызывающий проект:
//-------------------------------------------
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.
//******Проект 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.
Страницы: 1 вся ветка
Текущий архив: 2004.02.13;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c