Приведение типов объектов в DLL (замысловатая ку-ку)
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Всем ку!
Появилась неожиданная проблема.
Есть куча классов, наследуемых от TBaseClass
например:
TRaspred = class(TBaseClass)
В приложении создаются экземпляры этих классов, заполняются данными, все дела.
Потом передаются ф-ии из Dll:
fnDAMain(ptrPS:PPS),
где PPS = ^TPS (TPS тож наследуется от TBaseClass)
в DLL в fnDAMain есть такой код:
iIkCnt: integer;
ptrPS: PPS;
ptrRU: PBASECLASS; //PBASECLASS = ^TBaseClass
...
ptrRU := ptrPS^.GetListObject(i);
{возвращает PBASECLASS. Но по факту указывает на объект класса TRaspred,
и потом}
iIkCnt := (ptrRU^ as TRaspred).GetListCount(2);
На этой строке появляется имсключение EInvalidCast с матом: Invalid type cast.
Хотя! Если эту fnDAMain(ptrPS:PPS) вызывать не через DLL, а просто скомпилить в приложение, то все пучком.
Смотрел адреса, куда указатели показывают. В приложении и DLL они совпадают.
DLL подключал и явно и неявно. По-барабану. Та же ошибка.
Что это может быть и как это исправить или обойти?
Появилась неожиданная проблема.
Есть куча классов, наследуемых от TBaseClass
например:
TRaspred = class(TBaseClass)
В приложении создаются экземпляры этих классов, заполняются данными, все дела.
Потом передаются ф-ии из Dll:
fnDAMain(ptrPS:PPS),
где PPS = ^TPS (TPS тож наследуется от TBaseClass)
в DLL в fnDAMain есть такой код:
iIkCnt: integer;
ptrPS: PPS;
ptrRU: PBASECLASS; //PBASECLASS = ^TBaseClass
...
ptrRU := ptrPS^.GetListObject(i);
{возвращает PBASECLASS. Но по факту указывает на объект класса TRaspred,
и потом}
iIkCnt := (ptrRU^ as TRaspred).GetListCount(2);
На этой строке появляется имсключение EInvalidCast с матом: Invalid type cast.
Хотя! Если эту fnDAMain(ptrPS:PPS) вызывать не через DLL, а просто скомпилить в приложение, то все пучком.
Смотрел адреса, куда указатели показывают. В приложении и DLL они совпадают.
DLL подключал и явно и неявно. По-барабану. Та же ошибка.
Что это может быть и как это исправить или обойти?
-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
попробуй
добавить в dpr и dll.
Код: Выделить всё
uses
ShareMem;
-
- Сообщения: 74
- Зарегистрирован: 10 май 2006, 12:19
- Откуда: Санкт-Петербург
- Контактная информация:
PBASECLASS = ^TBaseClass
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.mc - это указатель. Для разработчика это объект с определенным набором полей и методов, но для программы это указатель
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.
Код: Выделить всё
TMyClass = class
.....
end;
...
var
mc: TMyClass;
begin
....
mc := TMyClass.Create;
...
end;
...
Спасибо, товарищи! Попробую сделать как указали. Отпишу, что получится
Попробовал подключить ShareMem к dpr и dll. Не вышло. Ошибка так же и там же.
А это поможет?vunder писал(а):PBASECLASS = ^TBaseClass
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.
И, кстати. Как бы Вы решили эту проблему в корне. Т.е. надо к приложению подключить dll, кот-ая будет обрабаывать дерево объектов, созданных в приложении.
-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
Забыл сказать, ShareMem надо первым поставить.790 писал(а):Попробовал подключить ShareMem к dpr и dll. Не вышло. Ошибка так же и там же.
-
- Сообщения: 74
- Зарегистрирован: 10 май 2006, 12:19
- Откуда: Санкт-Петербург
- Контактная информация:
Модульные приложения я давно пишу с использование bpl-файлов, так меньше заморочек с их загрузкой. А вообще я уже говорил: пишется модуль, содержащий иерархию классов. В dll через функцию передается указатель: procedure SetParams (Obj: TMyObject);790 писал(а):И, кстати. Как бы Вы решили эту проблему в корне. Т.е. надо к приложению подключить dll, кот-ая будет обрабаывать дерево объектов, созданных в приложении.
Это для меня параметры - объект, для компилятора это указатель.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Дык, крышечку-то убрать.iIkCnt := (ptrRU^ as TRaspred).GetListCount(2);
PS
ShareMem - в данном случае не при чем.