Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.007 c
14-86545
Pavelsin
2003-12-02 13:03
2003.12.26
nosmoking


3-86304
DDP1
2003-12-02 13:10
2003.12.26
Постраничная выборка в ADO


3-86315
alless
2003-12-01 11:08
2003.12.26
Как узнать что поменялся Width в DBGrid?


14-86549
R
2003-12-02 04:16
2003.12.26
Delphi 5 Standart


3-86303
Vick
2003-12-02 12:05
2003.12.26
Переопределение temporary file folder в MSSQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский