Доброго времени суток!
Суть проблемы, есть приложение, которое динамически подгружает библиотеку, и берет из нее функцию и выполняет её.
Есть 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