Приведение типов объектов в DLL (замысловатая ку-ку)

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
790
Сообщения: 8
Зарегистрирован: 25 май 2006, 23:37

Всем ку!
Появилась неожиданная проблема.
Есть куча классов, наследуемых от 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 подключал и явно и неявно. По-барабану. Та же ошибка.
Что это может быть и как это исправить или обойти?
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

попробуй

Код: Выделить всё

uses
  ShareMem;
добавить в dpr и dll.
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

PBASECLASS = ^TBaseClass
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.

Код: Выделить всё

TMyClass = class
.....
end;
...
var
  mc: TMyClass;
begin
....
  mc := TMyClass.Create;
...
end;
...
mc - это указатель. Для разработчика это объект с определенным набором полей и методов, но для программы это указатель
790
Сообщения: 8
Зарегистрирован: 25 май 2006, 23:37

Спасибо, товарищи! Попробую сделать как указали. Отпишу, что получится
790
Сообщения: 8
Зарегистрирован: 25 май 2006, 23:37

Попробовал подключить ShareMem к dpr и dll. Не вышло. Ошибка так же и там же.
790
Сообщения: 8
Зарегистрирован: 25 май 2006, 23:37

vunder писал(а):PBASECLASS = ^TBaseClass
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.
А это поможет?
790
Сообщения: 8
Зарегистрирован: 25 май 2006, 23:37

И, кстати. Как бы Вы решили эту проблему в корне. Т.е. надо к приложению подключить dll, кот-ая будет обрабаывать дерево объектов, созданных в приложении.
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

790 писал(а):Попробовал подключить ShareMem к dpr и dll. Не вышло. Ошибка так же и там же.
Забыл сказать, ShareMem надо первым поставить.
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

790 писал(а):И, кстати. Как бы Вы решили эту проблему в корне. Т.е. надо к приложению подключить dll, кот-ая будет обрабаывать дерево объектов, созданных в приложении.
Модульные приложения я давно пишу с использование bpl-файлов, так меньше заморочек с их загрузкой. А вообще я уже говорил: пишется модуль, содержащий иерархию классов. В dll через функцию передается указатель: procedure SetParams (Obj: TMyObject);
Это для меня параметры - объект, для компилятора это указатель.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

iIkCnt := (ptrRU^ as TRaspred).GetListCount(2);
Дык, крышечку-то убрать.

PS

ShareMem - в данном случае не при чем.
Ответить