powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Bpl и RTTI (TValue). Проблема?
9 сообщений из 9, страница 1 из 1
Bpl и RTTI (TValue). Проблема?
    #40004746
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В приложении из загруженной Bpl получаю класс примерно следующим образом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        
....
        Pointer(@AGetClass) := GetProcAddress(FHandleBpl,GetNameClassEntry());
        Pointer(@AGetModuleInfo) := GetProcAddress(FHandleBpl,GetNameModuleInfo());
        if (Pointer(@AGetModuleInfo) <> nil) then
          begin
            FLibModule := AGetModuleInfo();
            RegisterModule(FLibModule);
//  Создаем объект
            AClass := AGetClass();
            FEntryInfo := TEntryInfo(Activator.CreateInstance(AClass,[]));
          end;
// ...


Все нормально.

При вызове методов FEntryInfo все нормально. Однако, существует две большие проблемы:

1. При попытке доступа к свойствам FEntryInfo через RTTI возникает ошибка в System.RTTI: EInvalidCast.CreateRes(@SInvalidCast);
Для "родных" приложению объектов механизм доступа через RTTI работает замечательно, не дает сбоев, что давно проверено и полностью себя оправдывает.

2. При выгрузке Bpl делаю:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
         
...
        System.SysUtils.FreeAndNil(FEntryInfo); // Можно и через RTTI. Деструктор срабатывает штатно. А дальше получаю AV.
        if (Assigned(FLibModule)) then
          UnRegisterModule(FLibModule);
        FLibModule := nil;
        UnloadPackage(FHandleBpl);
        FHandle := 0;
...



AV получаю не сразу, а при закрытии приложения.

Что можете посоветовать? Допустимо такое совмещение Bpl и использование RTTI?
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004776
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas,
Пакеты - это dll. Ты копилируешь пакет и основное приложение с одним и тем же runtime bpl?
Если нет, то у тебя будут разные менеджеры памяти и так делать нельзя.
А если да, то менеджер памяти одинаковый и ошибка в другом.
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004788
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014Ты компилируешь пакет и основное приложение с одним и тем же runtime bpl?
Приложение и пакет (runonly) компилируются отдельно.
ziv-2014Если нет, то у тебя будут разные менеджеры памяти и так делать нельзя.
1. Уточнение: ziv-2014, после того как написал свое сообщение обнаружил, что ошибка возникает при использовании в главном окне Dev express компонент. Если они размещены на форме - вылетает AV при закрытии формы
2. Ошибка EInvalidCast.CreateRes(@SInvalidCast) возникает в System.RTTT из-за того, что
+ стр. 4167: сравниваются указатели
Код: pascal
1.
2.
3.
4.
5.
  if FData.FTypeInfo = ATypeInfo then
  begin
    AResult := Self;
    Exit(True);
  end;


Необходимо было бы дальше добавить
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if (FData.FTypeInfo = nil) or (ATypeInfo = nil) then
  begin
    Exit(False);
  end;

if FData.FTypeInfo^.Name = ATypeInfo^.Name then
  begin
    AResult := Self;
    Exit(True);
  end;


И в других местах есть нечто подобное (стр. 2804, 3392 и т.д.). Например:

Код: pascal
1.
2.
3.
4.
    Result := (ATypeInfo = System.TypeInfo(Boolean)) or
      (ATypeInfo = System.TypeInfo(ByteBool)) or
      (ATypeInfo = System.TypeInfo(WordBool)) or
      (ATypeInfo = System.TypeInfo(LongBool));



Это как раз и мешает нормальному присваиванию значений.

Это по моему скромному мнению. Возможно я не прав
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004794
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
Необходимо было бы дальше добавить
if FData.FTypeInfo^.Name = ATypeInfo^.Name then
  begin
    AResult := Self;
    Exit(True);
  end;


Попытка сравнивать классы по имени говорит о том, что у вас разные менеджеры памяти.
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004796
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrПопытка сравнивать классы по имени говорит о том, что у вас разные менеджеры памяти
DimaBr, получается именно так.
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004803
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда курите именно то что написал ziv-2014
Код: pascal
1.
2.
3.
if FData.FTypeInfo = ATypeInfo then
// какой смысл сравнивать имена, если типы не равны строчкой выше  ?
if FData.FTypeInfo^.Name = ATypeInfo^.Name then
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004813
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, хотелось бы уточнить:
RTTI для типа создается менеджером памяти или компилятором?
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004834
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
DimaBrПопытка сравнивать классы по имени говорит о том, что у вас разные менеджеры памяти

DimaBr, получается именно так.
Вам необходимо откомпилировать приложение с пакетом, в котором есть system.rtti.pas.
Откомпилировать bpl с этим же пакетом.
Тогда будет общий менеджер памяти и должно работать.
Иначе используйте интерфейсы.
...
Рейтинг: 0 / 0
Bpl и RTTI (TValue). Проблема?
    #40004835
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas,

Если бинарники собираются без единой RTL, то и внутренние структуры будут разными. То есть, у каждого бинарного модуля будет своя отдельная RTTI и все другие внутренние структуры.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Bpl и RTTI (TValue). Проблема?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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