Форум: "Основная";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
ВнизПомогите с 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c