Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-36733
Галин Алексей
2003-12-01 13:59
2003.12.12
Помогоите с OLE-Automation тип Object(VB) это VARIANT(IDL)???


6-36785
LOGic
2003-10-15 14:57
2003.12.12
Уважаемые мастера !! вот с такой проблемой столкнулся нужно по PO


14-36819
Sergeant ///
2003-11-19 15:34
2003.12.12
Перенос приложения


8-36769
GreySerg
2003-08-15 13:06
2003.12.12
Компоненты для работы с Mp3


4-36901
EvgenyDr
2003-10-16 14:53
2003.12.12
Размер физического диска





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский