Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизПодключить к форме хранимой в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c