• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Приведение типов объектов в Dll

  • Автор темы 790
  • Дата начала
Статус
Закрыто для дальнейших ответов.
7

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 подключал и явно и неявно. По-барабану. Та же ошибка.
Что это может быть и как это исправить или обойти?
 
S

Shurik Ilyin


iIkCnt: integer;
ptrPS: PPS;
ptrRU: PBASECLASS; //PBASECLASS = ^TBaseClass
...
ptrRU := ptrPS^.GetListObject(i);

{возвращает PBASECLASS. Но по факту указывает на объект класса TRaspred,
и потом}


iIkCnt := (ptrRU^ as TRaspred).GetListCount(2);

Попробуй:
1. iIkCnt := TRaspred(ptrRU^).GetListCount(2);
2. Посмотреть в dll состояние директивы {$M+}, она же {$TYPEINFO ON}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!