Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.04 c
7-1073743146
Angel_Forever
2004-01-10 16:59
2004.04.11
Quake & CS


14-1079115770
Замороченный
2004-03-12 21:22
2004.04.11
Объясните последовательность установки C# Builder


14-1079688431
Knight
2004-03-19 12:27
2004.04.11
Расчёт прокладки LAN


1-1080018399
Pr0ger
2004-03-23 08:06
2004.04.11
List Box


1-1082824363
Я Ламер
2004-04-24 20:32
2004.04.11
Классы и TObject





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