Форум: "Основная";
Текущий архив: 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.043 c