Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблемы с RTTI / 10 сообщений из 10, страница 1 из 1
18.05.2018, 00:28
    #39646442
Задумчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Есть проект который писался под Delphi 10.2.3 и всё работает отлично.

Но когда в путях оказываются пробелы... То код начинает дохнуть.

К примеру первый вызов
Код: pascal
1.
ShowMessage(length(TRttiContext.Create.GetType(TForm).GetMethods).ToString);



Возвращает 188

А второй вызов, уже возвращает
raised exception class $C0000005 with message 'access violation at 0x0040dd74: read of address 0xfffffff7'.

Ошибка происходит при вызове GetMethods

Код: pascal
1.
2.
3.
4.
unit System; 
procedure _DynArrayAsg(var Dest: Pointer; Src: Pointer; TypeInfo: Pointer);
....
        CMP     dword ptr [EDX-8],0




Если я удаляю из путей пробелы То всё работает хорошо!

Реальный путь который работает
C:\Users\*\Desktop\regrth


Реальный путь который не работает
C:\Users\*\Desktop\regrth rthjt trhrtjty

С чем связанно не знаю.
...
Рейтинг: 0 / 0
18.05.2018, 00:43
    #39646444
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
QC (или как он там щас называется) знает про эту проблему?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.05.2018, 02:40
    #39646448
Задумчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Гаджимурадов Рустам,

Проблема была найдена!

Виновником стала регистрация классов TBCDBEditor && TBCEditor посредством RegisterClasses

Каким образом они ломают RTTI мне не понятно
...
Рейтинг: 0 / 0
18.05.2018, 07:58
    #39646492
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Виновник найден, но виновность его не доказана!!!
...
Рейтинг: 0 / 0
18.05.2018, 09:32
    #39646529
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Я предположу, что дело в контексте
Какие-то были проблемы с его повторным созданием без удаления
...
Рейтинг: 0 / 0
18.05.2018, 10:27
    #39646557
Задумчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
DimaBr,

Его виновность доказана ровно на том моменте, когда его нет в списке регистрации - всё работает как надо


[quot SOFT FOR YOU]Я предположу, что дело в контексте
Проверил такую возможность, даже класс скопировал с новым именем, и попробовал его зарегистрировать. Так же падает


Вот что в итоге



...
Рейтинг: 0 / 0
18.05.2018, 11:02
    #39646581
Задумчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Проблема начинает быть ещё на самом старте программы. Когда пытаешься объявить в верху


Код: pascal
1.
2.
3.
4.
  TBEditor22 = class(TBCCustomEditor)
  published

  end;



И его зарегистрировать.

Регистрация самого TBCCustomEditor проходит успешно, и работает как надо.

А вот создание унаследованного - ломает RTTI

Если вместо TBCCustomEditor написать любой другой класс, работает как надо

Странно что компилятор из другого юнита сразу не выдаёт ошибки
...
Рейтинг: 0 / 0
18.05.2018, 11:33
    #39646596
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Регистрация самого TBCCustomEditor проходит успешно, и работает как надо.
А вот создание унаследованного - ломает RTTI
Неужеле ??? А TBCCustomEditor не унаследованный ?
...
Рейтинг: 0 / 0
18.05.2018, 11:42
    #39646604
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Такое ощущение что вы ищите чёрную кошку в чёрной комнате, а она в соседней.
Где то портите память, а косяки вылезают здесь.
Да и код ваш работает
...
Рейтинг: 0 / 0
18.05.2018, 12:08
    #39646620
Задумчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с RTTI
Пришлось глубже нырнуть.


Нашёл что ошибка срабатывает при поиске класса, (При повторном поиске другого, не важно какого)
Код: pascal
1.
  Result := Rtti.GetType(FindTypeInfo(ClassName));



Но это кидает на AV и не больше.

Исправил на
Код: pascal
1.
  Result := TRttiContext.Create.GetType(FindTypeInfo(ClassName));



Теперь ошибка просиходит в System.Rtti функция TRttiPool.GetPackageList

Код: pascal
1.
2.
3.
  // You're playing with fire if you try to race package addition and removal
  // in particular against RTTI operations. Please don't do that.
  Result := FLatestPackageList;




Комментарии выше порадовал. Значит разработчики знают о этом баге
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблемы с RTTI / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]