![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток!
Суть проблемы, есть приложение, которое динамически подгружает библиотеку, и берет из нее функцию и выполняет её. Есть DLL, в которой при вызове функции, создается компонент TPanel, на нем создается TButton с евентом OnClick, который описан в DLL. Панель помещается на форму приложения, которое использует DLL. В результате, панель с кнопкой создаются, но при нажатии на кнопку, вылетает Access Violation. Библиотека и приложение компилируются с RunTime пакетами. Если подгружать dll статически, то все работает. Dll Код:
library CreateControlInDLL;
uses
windows,dialogs,
ExtCtrls,
StdCtrls,Forms,buttons, Messages,
SysUtils, Variants, Classes, Graphics, Controls;
var
i:integer;
type TNewPanel = class
Button1:TButton;
Panel1:TPanel;
procedure Button1Click(Sender: TObject);
Constructor Create(handle:HWND);
end;
Constructor TNewPanel.Create(handle:HWND);
var
Panel1:TPanel;
begin
Panel1 := TPanel.Create(nil);
Panel1.ParentWindow := handle;
Button1 :=TButton.Create(nil);
Button1.ParentWindow:=Panel1.Handle;
Button1.OnClick:=Button1Click;
end;
procedure TNewPanel.Button1Click(Sender: TObject);
begin
showmessage('1');
end;
function CreatePanel(aParent: HWND):TPanel;
begin
TNewPanel.Create(aParent);
end;
exports
CreatePanel INDEX 1;
end.Приложение Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//function CreatePanel(aParent: HWND): TPanel; external 'Project1.dll';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
CreatePanel : function (aParent: HWND):TPanel;
hndDLLHandle: THandle;
begin
hndDLLHandle := loadLibrary (PChar('Project1.dll'));
if hndDLLHandle = 0 then exit;
@CreatePanel := GetProcAddress(hndDLLHandle,'CreatePanel');
CreatePanel(Form1.Handle);
freeLibrary ( hndDLLHandle );
end;
end.исходник project.rar.html |