Форум по 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
Ответить с цитированием
  #2  
Старый 22.12.2010, 09:31
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А баблиотеку-то зачем выгрузил если код из нее используешь?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 22.12.2010, 09:34
CarnoPhage CarnoPhage вне форума
Прохожий
 
Регистрация: 06.01.2008
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
А баблиотеку-то зачем выгрузил если код из нее используешь?
Емае, копипаст зло. Спасибо ! Прошу прощение за то что потратил ваше время!

Стыдно то как =)

Последний раз редактировалось CarnoPhage, 22.12.2010 в 09:36.
Ответить с цитированием
  #4  
Старый 22.12.2010, 13:23
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Код:
function CreatePanel(aParent: HWND):TPanel;
begin
  Result:=TNewPanel.Create(aParent);
end;

Код:
  freeLibrary ( hndDLLHandle ); -- это надо юзать при завершении программы.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter