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

Вниз

Invalid Poiner Operation - почему ?   Найти похожие ветки 

 
Vlad ©   (2004-03-19 20:44) [0]

Пытаюсь в процедуру передать указатель на заранее созданный  объект TDataModule.
Библиотечная процедура выглядит примерно так:

procedure Test(DM:TDataModule); stdcall;
var S: String;
  dmMain1: TdmMain; // Экземпляр TdataModule
begin
 dmMain1:=TdmMain(DM);
 S:=dmMain1.Query1.FieldByName("Field1").AsString;
 ShowMessage(S);
end;


В приложении вызываю эту процедуру с помощью LoadLibrary и GetProcAddress;
Вот что непонятно: первые два вызова процедура отрабатывает нормально, а на третий получаю Invalid Pointer Operation как только эта процедура завершается.
Что-то я уже совсем запутался, подскажите что не так, и можно ли вобще передавать TDataModule в библиотеку и нормально работать с ним ?
Спасибо.


 
Skier ©   (2004-03-19 20:49) [1]

Разруливай через интерфейс


 
Vlad ©   (2004-03-19 21:01) [2]


> Skier ©   (19.03.04 20:49) [1]

Не понял, как через интерфейс? У меня обычная библиотека (не COM)


 
Cobalt ©   (2004-03-20 01:18) [3]

> можно ли вобще передавать TDataModule в библиотеку
Рекомендуется в таком случае компилировать с run-time пакетами (*.bpl)


 
Vlad ©   (2004-03-20 18:03) [4]


> Cobalt ©   (20.03.04 01:18) [3]

И правда ! Скомпилировал приложения с Run-time packages и все заработало.
Спасибо за совет.
А все-таки хочется понять, в чем собственно дело ? Почему нужны пакеты и возможно ли такое сделать без них, хотелось бы сделать все в одном exe файле


 
Anatoly Podgoretsky ©   (2004-03-20 18:38) [5]

А ты что не прочитал распоряжение компилятора, когда создавал библиотеку, в следующий раз так не делай, прочитай.


 
just me   (2004-03-20 18:45) [6]

Я в такой ситуации обходился без Run-time packages, но в DLL создавал явно новый экземпляр модуля данных и его handle присваивал handle модуля данных хост-апликации. И не было (и до сих пор нет) никаких проблем.


 
Vlad ©   (2004-03-20 18:50) [7]


> Anatoly Podgoretsky ©   (20.03.04 18:38) [5]

Когда я создавал библиотеку, все что у меня было так это штук 10 строк в DPR"e c рекомендациями по поводу ShareMem, о каких еще распоряжениях компилятора идет речь ?


 
Anatoly Podgoretsky ©   (2004-03-20 18:58) [8]

Распоряжение по поводу ShareMem


 
just me   (2004-03-20 19:02) [9]

ShareMem здесь абсолютно не нужен


 
Anatoly Podgoretsky ©   (2004-03-20 19:09) [10]

Ну еще нужна и общая RTTI


 
Vlad ©   (2004-03-20 19:37) [11]


> Anatoly Podgoretsky ©   (20.03.04 18:58) [8]
> Распоряжение по поводу ShareMem

Чесное слово, сколько раз передавал указатели в библиотеку, еще никогда ShareMem не использовал, и вобще на сколько я понимаю, ShareMem требуется для работы с типом string, во всяком случае именно так сказано в том самом распоряжении компилятора.


 
DrPass ©   (2004-03-20 20:03) [12]

ShareMem требуется для работы с любыми динамическими объектами


 
Vlad ©   (2004-03-20 20:09) [13]


> DrPass ©   (20.03.04 20:03) [12]

Что значит "динамическими", а что, бывают статические объекты ? Если я создаю указатель, то я руками выделяю под него память, затем передаю этот указатель в библиотеку, после чего освобождаю память. Так я работал всегда, и вроде все работало как надо. Так зачем мне еще ShareMem, если и без него все работает, кто нибудь объяснит ?


 
just me   (2004-03-20 21:57) [14]

Совершенно согласен с Vlad-ом. И, кстати, в данной ситуации RTTI не есть обязательная вещь


 
DrPass ©   (2004-03-20 22:41) [15]

Бывают и статические (тип object). Если же ты работаешь с памятью в разных модулях, используя борландовский менеджер памяти (New/Dispose, GetMem/FreeMem), ты обязан использовать ShareMem. При работе с ANSI-строками, динамическими массивами, экземплярами классов также задействуется менеджер памяти, и ты тоже должен использовать ShareMem.

> Так я работал всегда, и вроде все работало как надо.

Утечка памяти - это весьма специфическая ошибка. Она далеко не всегда себя проявляет, и ее единственный признак - это сбой без видимых причин.


 
DrPass ©   (2004-03-20 22:44) [16]

Вдогонку: речь идет только о ситуации, когда с одним и тем же объектом должна работать и DLL, и программа. Если объект создается/изменяется/разрушается только в одном модуле, ShareMem не нужем


 
Vlad ©   (2004-03-21 13:06) [17]


> DrPass ©   (20.03.04 22:41) [15]

Хм... весьма интересное утверждение (по поводу утечки памяти). Надо бы проверить. В любом случае, спасибо за информацию.
Однако что касается моей задачи, то тут ShareMem меня не спасает, это я уже проверял. Спасла компиляция с ран-тайм пакетами, но я пока так и не понял почему. Пытался смотреть CPU, но там тоже особо ничего не понял.


 
just me   (2004-03-21 15:24) [18]

"компиляция с ран-тайм пакетами" спасла потому, что при этом TDataModule в хосте и библиотеке стал одним и тем же объектом. Другой подход (я постил уже это) - сождать в библиотеке TDataModule и подсунуть ему handle TDataModule хоста. Начал практиковать такие штуки еще в эпоху Delphi2, когда пакетов еще не было. Продолжаю иногда и до сих пор. И никаких утечек - проблема сия иссследовалась особо.


 
Vlad ©   (2004-03-21 16:25) [19]


> just me   (21.03.04 15:24) [18]


> подсунуть ему handle TDataModule хоста

У TDataModule нет свойства Handle, хотя вобщем я делаю примерно так как ты и говоришь. В библиотеке и в хост-аппликации держу один и тот же DataModule, и при вызове библиотечной процедуры присваиваю указатель (но не хендл), это видно из моего первого поста:
procedure Test(DM:TDataModule); stdcall;
var S: String;
 dmMain1: TdmMain; // Экземпляр TdataModule, того же что и в хост-аппликации
begin
dmMain1:=TdmMain(DM);
 .....

И без ран-тайм пакетов это приводит к вышеописанной ошибке.


 
just me   (2004-03-21 16:40) [20]

Дико извиняюсь - имел в виду все время TDataBase вместо TDataModule.



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

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

Наверх




Память: 0.51 MB
Время: 0.03 c
14-1082064425
Asteroid
2004-04-16 01:27
2004.04.11
3D shooter в 96KB. Кто меньше? :)


11-1059981569
VitaLMoya
2003-08-04 11:19
2004.04.11
При компиляции компилятор не находит DsgnIntf.dcu


1-1082870985
Артем К.
2004-04-25 09:29
2004.04.11
Проблема с предварительным просмотром в QuickReport


1-1082638145
Бегун
2004-04-22 16:49
2004.04.11
Двигаем форму


1-1082305013
AlexeyV
2004-04-18 20:16
2004.04.11
Копирование файлов