Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.12.2010, 09:09
CarnoPhage CarnoPhage вне форума
Прохожий
 
Регистрация: 06.01.2008
Сообщения: 14
Репутация: 10
Вопрос OnClick кнопки созданной из динмамической DLL

Доброго времени суток!
Суть проблемы, есть приложение, которое динамически подгружает библиотеку, и берет из нее функцию и выполняет её.

Есть 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
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:58.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025