Форум: "Прочее";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизНедавно увидел статью.... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.062 c