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

Вниз

Недавно увидел статью....   Найти похожие ветки 

 
litt   (2006-10-02 15:02) [0]

В которой ктото спрашивал:
"Как вызвать MDI форму из DLL",
По всем вопросом и ответам прошолся.... Не получилось...
Какие я повторил ошибки или может не допонял???

DLL:

library dCardMDI;

uses
 SysUtils,
 Classes,
 Forms,
 uCardMDI in "uCardMDI.pas" {CardForm};

var
 DLLApp: TApplication;
 DLLScr: TScreen;

{$R *.res}

procedure InitPlugin(App, Scr: integer); StdCall;
begin
 DLLScr:= Screen;
 Screen:= TScreen(Scr);
 DLLApp:= Application;
 Application:= TApplication(App);
end;

procedure DonePlugin; StdCall;
begin
 Screen:= DLLScr;
 Application:= DLLApp;
end;

function CreateCardMDI: integer; StdCall;
begin
 Result:= integer(TCardForm.Create(Application))
end;

exports
 InitPlugin,
 DonePlugin,
 CreateCardMDI;

begin
end.


Вызываю при нажатии на кнопку....:

unit uMainForm;

interface

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

type

 TMainForm = class(TForm)
   mTop: TMainMenu;
   N1: TMenuItem;
   mToolB: TToolBar;
   ToolButton1: TToolButton;
   StatusB: TStatusBar;
   ToolButton2: TToolButton;
   ToolButton3: TToolButton;
   N2: TMenuItem;
   procedure N2Click(Sender: TObject);

 private
   { Private declarations }

 public
   { Public declarations }

 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.N2Click(Sender: TObject);
var
 CardHandle: THandle;
 ff:tt;
begin
 CardHandle:= LoadLibrary("dll\Card\dCardMDI.dll");
 GetProcAddress(CardHandle,"CreateCardMDI");
 FreeLibrary(CardHandle);
end;

end.


 
Карелин Артем ©   (2006-10-02 15:24) [1]


>  CardHandle:= LoadLibrary("dll\Card\dCardMDI.dll");
Загрузили DLL
>  GetProcAddress(CardHandle,"CreateCardMDI");
Получили адрес
>  FreeLibrary(CardHandle);
Освободили??

А где сама работа?


 
clickmaker ©   (2006-10-02 15:29) [2]


> litt   (02.10.06 15:02)

а че за статья, и че не получилось?


 
guav ©   (2006-10-02 15:38) [3]

> procedure InitPlugin(App, Scr: integer); StdCall;
> begin
> DLLScr:= Screen;
> Screen:= TScreen(Scr);
> DLLApp:= Application;
> Application:= TApplication(App);
> end


Интересный способ "обойти" запрет переавать Delphi-классы между модулями :-)  нет, всё равно это опасный приём.
MDI никогда не применял. но рекомендую поискать способ передавать хендлы окон а не классы.


 
clickmaker ©   (2006-10-02 16:13) [4]


> Интересный способ "обойти" запрет переавать Delphi-классы
> между модулями

а чего такого? Более того, к integer приводить ничего и не надо. Главное, чтобы и хост-экзе и DLL были собраны с одними и теми же RT-пакетами.


 
REA   (2006-10-02 17:06) [5]

Делал MDI в DLL. Работает со скрипом.


 
clickmaker ©   (2006-10-02 17:41) [6]

лучше даже делать не MDI в DLL, а MDI в EXE. А в DLL - Frame с начинкой для mdi-child


 
guav ©   (2006-10-02 17:51) [7]

> [4] clickmaker ©   (02.10.06 16:13)


> а чего такого?


Две проблемы:
1.
> Главное, чтобы и хост-экзе и DLL были собраны с одними и
> теми же RT-пакетами.
, причём можно использовать классы только из этих пакетов.
и эти пакеты должны быть в виде отдельных .bpl , иначе могут быть проблемы (например, с операторами is и as).
2. Разные менеджеры памяти. Строки в классах можно менять только в одном из модулей, инае будут ошибки.


 
clickmaker ©   (2006-10-02 18:22) [8]


> эти пакеты должны быть в виде отдельных .bpl

ну да, а как иначе?

> Разные менеджеры памяти

borlndmm.dll в помощь


 
guav ©   (2006-10-02 18:48) [9]

> [8] clickmaker ©   (02.10.06 18:22)


> > эти пакеты должны быть в виде отдельных .bpl


> ну да, а как иначе?


Ну если так то и вторая проблема снимается.
Просто непонятно, зачем тогда классы к integer приводить.



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

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

Наверх




Память: 0.49 MB
Время: 0.051 c
15-1159867013
Multy
2006-10-03 13:16
2006.10.22
Табличные функции


15-1159504912
ilya39
2006-09-29 08:41
2006.10.22
Поиск Yandex в Opere


6-1148771339
Ezorcist
2006-05-28 03:08
2006.10.22
По написанию нового компонета от TServerSocket и TClientSocket.


3-1156846974
Дырчик
2006-08-29 14:22
2006.10.22
Как запаковать таблицу


15-1159467143
Piter
2006-09-28 22:12
2006.10.22
Фантастика... Сколько раз американцы высаживались на Луну?