Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

Подключить к форме хранимой в Dll таблицу, Table - на глав. форме   Найти похожие ветки 

 
Chery   (2003-12-01 12:56) [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" ...


 
Digitman ©   (2003-12-01 13:10) [1]

почему

function ShowForm : Integer; stdcall;

в то время как

TShowForm = procedure(AForm : TForm);

????

как , по твоему, соотносятся эти два объявления ?


 
Chery   (2003-12-01 17:39) [2]

Сорри за ламерство. Я взял это из примера.
Так что ты предлагаешь?


 
panov ©   (2003-12-01 17:50) [3]

Согласовать надо метод передачи параметров:
type
ShowForm: procedure(AForm : TForm); stdcall;


 
Digitman ©   (2003-12-01 18:08) [4]

и вызывающий и вызываемый код должны быть объявлены одинаково : если это - ф-ция, значит и там и там это ф-ция,
если вызываемая ф-ция требует stdcall-соглашения о вызове, значит и вызывающий код должен использовать то же самое соглашение


 
Chery   (2003-12-01 18:27) [5]

Так что мне изменить: TShowForm = procedure(AForm : TForm);
на функцию ?

Поменял TShowForm = procedure(AForm : TForm); на
TShowForm = procedure(AForm : TForm);stdcall; - ничего не произошло.


 
Digitman ©   (2003-12-01 18:40) [6]

ну да бог с ним) ... опустим несоответствие между "процедура" и "функция" ... не суть как важно, главное - согл-я о вызове соблюл) ...

так а что, по твоему, д.б. произойти ?


 
Chery   (2003-12-02 10:43) [7]

Эх-хе-хе...
А это разве не есть согл-ие о вызове?
Что конкретно надо изменить? Плиз.


 
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.


 
Chery   (2003-12-02 13:08) [9]

Может тут что-то с тем, что я пытаюсь что-то с Тable1 сделать из модуля формы (FormDll1), хранимой в dll, а не из самой dll(Unit1.Form1.Table1.Active:=True;) ??? Unit1.Form1 - глав. юнит и форма.
И Application.Handle:= ss; - в dll на открытии формы, может его перенести куда?


 
Digitman ©   (2003-12-02 13:36) [10]


> я пытаюсь что-то с Тable1


я вот вообще не вижу в твоем коде никаких упоминаний о Table1
все что ты делаешь, насколько я вижу - просто создаешь некую новую форму и визуализируешь ее в иод.режиме

где ? где хоть какие-либо обращения к объекту, я вляющемуся частью другой формы ?



Страницы: 1 вся ветка

Текущий архив: 2003.12.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-36723
Alexadna
2003-12-02 13:02
2003.12.12
Позиция курсора в строке


14-36820
Igor_thief
2003-11-19 18:21
2003.12.12
Монитор


4-36908
alexsc
2003-10-20 11:48
2003.12.12
добавить информацию о файле в структуру NTFS


14-36839
Василиск
2003-11-18 19:22
2003.12.12
Как написать батник на ребут компа?


8-36771
Stexen
2003-08-14 01:10
2003.12.12
Рисование в увеличении