![]() |
|
|
Регистрация | << Правила форума >> | 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 |
#2
|
||||
|
||||
![]() А баблиотеку-то зачем выгрузил если код из нее используешь?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
![]() Цитата:
Стыдно то как =) Последний раз редактировалось CarnoPhage, 22.12.2010 в 09:36. |
#4
|
|||
|
|||
![]() Код:
function CreatePanel(aParent: HWND):TPanel; begin Result:=TNewPanel.Create(aParent); end; Код:
freeLibrary ( hndDLLHandle ); -- это надо юзать при завершении программы. |