Страница 1 из 1

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

Добавлено: 31 май 2006, 00:55
790
Всем ку!
Появилась неожиданная проблема.
Есть куча классов, наследуемых от 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 подключал и явно и неявно. По-барабану. Та же ошибка.
Что это может быть и как это исправить или обойти?

Добавлено: 31 май 2006, 09:28
Blood_Magic
попробуй

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

uses
  ShareMem;
добавить в dpr и dll.

Добавлено: 31 май 2006, 13:42
vunder
PBASECLASS = ^TBaseClass
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.

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

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

Добавлено: 31 май 2006, 21:32
790
Спасибо, товарищи! Попробую сделать как указали. Отпишу, что получится

Добавлено: 01 июн 2006, 23:36
790
Попробовал подключить ShareMem к dpr и dll. Не вышло. Ошибка так же и там же.

Добавлено: 01 июн 2006, 23:37
790
vunder писал(а):PBASECLASS = ^TBaseClass
необязательно. Экземпляр класса это уже сам по себе указатель на участок памяти, т.е.
А это поможет?

Добавлено: 01 июн 2006, 23:40
790
И, кстати. Как бы Вы решили эту проблему в корне. Т.е. надо к приложению подключить dll, кот-ая будет обрабаывать дерево объектов, созданных в приложении.

Добавлено: 02 июн 2006, 15:32
Blood_Magic
790 писал(а):Попробовал подключить ShareMem к dpr и dll. Не вышло. Ошибка так же и там же.
Забыл сказать, ShareMem надо первым поставить.

Добавлено: 03 июн 2006, 15:37
vunder
790 писал(а):И, кстати. Как бы Вы решили эту проблему в корне. Т.е. надо к приложению подключить dll, кот-ая будет обрабаывать дерево объектов, созданных в приложении.
Модульные приложения я давно пишу с использование bpl-файлов, так меньше заморочек с их загрузкой. А вообще я уже говорил: пишется модуль, содержащий иерархию классов. В dll через функцию передается указатель: procedure SetParams (Obj: TMyObject);
Это для меня параметры - объект, для компилятора это указатель.

Добавлено: 09 июн 2006, 03:34
Naeel Maqsudov
iIkCnt := (ptrRU^ as TRaspred).GetListCount(2);
Дык, крышечку-то убрать.

PS

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