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

Вниз

Помогите с DLL   Найти похожие ветки 

 
c0pYc@t   (2002-07-15 14:11) [0]

Попробывал поработать с DLL возникли вопросы:

Можно ил подключить динамически DLL, содержащюю форму, которую я пытаюсь отобразить немодальным.
Модальное окно отображается без проблем.

Код Dll

library ProjDll;

uses
SysUtils,
Classes,
DllFormU in "DllFormU.pas" {DLLForm};
{$R *.res}
exports
Showform, FreeForm;
begin
end.

Юнит Dll

unit DllFormU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TDLLForm = class(TForm)
ListBox1: TListBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure ShowForm(Appl, Form : THandle);
procedure FreeForm;
var
DLLForm: TDLLForm;
CallForm: THandle;
implementation

{$R *.dfm}
procedure ShowForm(Appl, Form:THandle);
begin
Application.Handle := Appl;
DllForm := TDllForm.Create(Application);
CallForm := Form;
DllForm.Show;
end;
procedure FreeForm;
begin
DllForm.Free
end;
procedure TDLLForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CallForm<>0 then
SendMessage(CallForm, wm_User,0, 0)
end;
end.

Код самой проги

unit TestU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
LibHandle: LongWord;
showForm: procedure(Appl, Form:THandle);stdcall;
freeForm: procedure;stdcall;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
@ShowForm := nil;
{Пытаемся загрузить библиотеку}
LibHandle := LoadLibrary("ProjDll.DLL");
{Если все OK}
if LibHandle >= 32 then begin
{...то пытаемся получить адрес функции в библиотеке}
@ShowForm := GetProcAddress(LibHandle,"ShowForm");
{Если и здесь все OK}
if @ShowForm <> nil then
{...то вызываем эту функцию и показываем результат}
showForm(Application.Handle, Self.Handle);
end;
Button2.Enabled := true;
Button1.Enabled := false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FreeForm;
Button1.Enabled := true;
Button2.Enabled := false;
end;
end.


 
Digitman ©   (2002-07-15 14:47) [1]

Конечно, можно. Не только можно, но в ряде случаев и желательно.

А в чем проблема-то собственно ?


 
c0pYc@t   (2002-07-16 08:15) [2]

Digitman Дык, при нажатии на Btn1 окно то появляется, но выдает ошибку при обращении к странице памяти по ffffff и так далее...


 
c0pYc@t   (2002-07-16 09:15) [3]

Прикиньте, вроде разобрался все дело в волшебных пузырьках)))))

просто при указании имени функции нужно не забывать про регистр букв, а то потом не разобраться чем D отличается от С

PS И еще отключите stdcall у функций в программе вызова, они нужны только при статической загрузке


 
Alx2 ©   (2002-07-16 10:18) [4]

>PS И еще отключите stdcall у функций в программе вызова,
> они нужны только при статической загрузке

Совершенно неверно.
Способ передачи параметров в функцию не зависит от способа загрузки DLL. Требуется только совпадение этой спецификации для хоста и для DLL.



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

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

Наверх




Память: 0.47 MB
Время: 0.015 c
1-95447
dimanew
2002-07-17 04:45
2002.07.29
Как создать динамич. массив TEditов?


4-95595
Voland!
2002-05-21 02:16
2002.07.29
Mouse


1-95325
Real
2002-07-16 22:55
2002.07.29
Как обратиться к объекту не имеющего имя?


1-95361
Skywalker
2002-07-15 17:43
2002.07.29
Форма


1-95350
Still Swamp
2002-07-17 21:03
2002.07.29
MSExcel