Форум: "Базы";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизПодключить к форме хранимой в Dll таблицу, Table - на глав. форме Найти похожие ветки
← →
Chery (2003-12-01 12:50) [0]Как подключить к форме хранимой в Dll таблицу, Table лежит на главной форме? (динамическая библиотека).
Подключаем библиотеку с Unit
procedure TForm1.Button3Click(Sender: TObject);
type
TShowForm = procedure(AForm : TForm);
var
DLLInstance : THandle;
ShowForm : TShowForm;
begin
try
DLLInstance := LoadLibrary("MYLIB.DLL");
if DLLInstance = 0 then begin
MessageDlg("Невозможно загрузить MYLIB.DLL", mtError, [mbOK], 0);
Exit;
end;
@ShowForm := GetProcAddress(DLLInstance, "ShowForm");
if @ShowForm <> nil then
ShowForm(Self)
else
MessageDlg("Не найдена искомая процедура!.", mtError, [mbOK], 0);
finally
FreeLibrary(DLLInstance);
end;
end;
В библиотеке:
uses
...
Unit1 in "Unit1.pas" {Form1}, //глав. юнит
FormDll1 in "FormDll1.pas" {FormDll}; //форма в dll
...
function ShowForm : Integer; stdcall;
var
Form : TFormDll;
begin
Form := TFormDll.Create(Application);
Result := Form.ShowModal;
Form.Free;
end;
В модуле формы: uses Unit1; //глав. юнит
Table на глав. форме.
При попытке что-либо сделать с Table через Dll форму (например Unit1.Form1.Table1.Active:=True;) выскакивает ошибка памяти:
Access violetion at adress 002BF26B in module "mydll.dll" ...
← →
Sandman25 (2003-12-01 13:36) [1]Используйте BPL, там это легко реализуется.
← →
sniknik (2003-12-01 14:44) [2]Sandman25 © (01.12.03 13:36) [1]
типа без них сложно. ;)
Chery (01.12.03 12:50)
передай из главного приложения хендл(Application.Handle) в dll и сделай в ней(в dll!!!) Application.Handle:= Handle; до всех действий.
уверен на 85% ошибка исчезнет.
← →
Sandman25 (2003-12-01 15:06) [3][2] sniknik © (01.12.03 14:44)
Если он передает TTable, значит, DLL все равно нельзя будет использовать нигде, кроме Delphi приложений. А посему зачем мучиться с DLL?
← →
Chery (2003-12-02 11:04) [4]sniknik:
Чё я не так делаю. Где и как именно мне надо передать значение
Application.Handle ?
Делаю так:
В главном уните: TShowForm = procedure(AForm : TForm; ss:hwnd);stdcall;
...
ShowForm(Self, Application.Handle);
Выдаёт ошибку : недопустимый дескриптор окна!
(тоесть явно я не правильно передаю.) ???
В Dll:
function ShowForm(ss:hwnd) : Integer; stdcall;
...
Application.Handle:= ss;
← →
sniknik (2003-12-02 12:22) [5]> В главном уните:
> TShowForm = procedure(AForm : TForm; ss:hwnd);stdcall;
> В Dll:
> function ShowForm(ss:hwnd) : Integer; stdcall;
параматры считать умееш? а процедуру от функции отличить?
← →
sniknik (2003-12-02 12:23) [6]35% ;о)))
← →
sniknik (2003-12-02 12:49) [7]посмотри сюда
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1070358516&n=0
← →
Chery (2003-12-02 13:00) [8]ХЕЛП.
Вроде всё поменял, но ничё не изменилось, та же ошибка:
главный модуль:
var
Form1: TForm1;
function ShowForm (AForm : TForm; ss:hwnd) : Integer; stdcall;
external "MYLIB.dll";
...
procedure TForm1.Button3Click(Sender: TObject);
type
TShowForm = function(AForm : TForm; ss:hwnd):Integer; stdcall;
var
DLLInstance : THandle;
ShowForm : TShowForm;
...
ShowForm(Self, Application.Handle);
...
В библтотеке:
uses ...
Unit1 in "Unit1.pas" {Form1},
FormDll1 in "FormDll1.pas" {FormDll};
...
function ShowForm(AForm : TForm; ss:hwnd) : Integer; stdcall;
var
Form : TFormDll;
s: string;
begin
Str(ss, s);
ShowMessage(s);
Application.Handle:= ss;
Form := TFormDll.Create(Application);
Result := Form.ShowModal;
end;
...
exports
DoSomething, Tabl, ShowForm;
begin
end.
← →
sniknik (2003-12-02 13:05) [9]ShareMem? см. пример.
← →
sniknik (2003-12-02 13:07) [10]> В библиотеке:
> uses
> ...
> Unit1 in "Unit1.pas" {Form1}, //глав. юнит
вот тут ShareMem присутствует?
← →
Chery (2003-12-02 13:08) [11]Может тут что-то с тем, что я пытаюсь что-то с Тable1 сделать из модуля формы (FormDll1), хранимой в dll, а не из самой dll(Unit1.Form1.Table1.Active:=True;) ??? Unit1.Form1 - глав. юнит и форма.
И Application.Handle:= ss; - в dll на открытии формы, может его перенести куда?
← →
Chery (2003-12-02 13:12) [12]Во всех есть:
unit FormDll1;
interface
uses
ShareMem,
...
library MYLIB;
uses
ShareMem,
...
unit Unit1;
interface
uses
SHAREMEM,
...
Я в панике.
← →
Chery (2003-12-02 13:57) [13]Спасибо за пример. Усё.
Правда до сих пор не пойму, почему у меня не пашет.
1) Я не передаю DataSource из глав. формы, а подсоединил глав юнит к форме длл (uses Unit1;)- ??
2) Не нравится что-то в глав. юните:
finally
FreeLibrary(DLLInstance);
Хоть и создаёт длл и компилит, но пишет Variable "DLLInstance"
might not have been initialized. Что-то с инициализацией.
← →
sniknik (2003-12-02 14:04) [14]> но пишет Variable "DLLInstance"
DLLInstance инициализируется в условии например, если не сработает условие будет баг.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c