Перейти к содержанию
Fire Monkey от А до Я
  • 0

Проблемы со стилями и релиз конфигурацией XE8 &C++


antarey

Вопрос

Есть код:

//---------------------------------------------------------------------------
void TForm1::AddItemToList(String list)
{
TListBoxItem *listItem;


ListBoxFile->BeginUpdate();
listItem = new TListBoxItem(ListBoxFile);
listItem->StyleLookup="listboxitembottomdetailExt";
listItem->Height=52;

listItem->ItemData->Text=list;
listItem->ItemData->Detail=list;
listItem->StylesData["infodate"] = TValue::From<String>(list);
listItem->StylesData["infosum"] = TValue::From<String>(list);
ListBoxFile->AddObject(listItem);


  ListBoxFile->EndUpdate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AddItemToList("test");
}
//---------------------------------------------------------------------------

На форме StyleBook со своим стилем итемов для ЛистБокса

Все отлично работает, пока не переключаю на релиз конфигурацию и не уберу галки с Link with dynamik RTL & Link with runtime package.

Причем access violation получаю уже на старте.

 

Проблема в строках

listItem->StylesData["infodate"] = TValue::From<String>(list);
listItem->StylesData["infosum"] = TValue::From<String>(list);

В чем проблема? на ХЕ7 все работало

В атаче тестовый проект.

 

 

Test.zip

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Причем, такая же проблема с примером c:\Users\Public\Documents\Embarcadero\Studio\16.0\Samples\CPP\FireMonkey Desktop\CustomListBox

Переключить на релиз и убрать галки с Link with dynamik RTL & Link with runtime package получим кырдык 

Ссылка на комментарий
  • 0

Хм - странное поведение. Ошибок не бъет, собирается, но при этом приложение не стартует (опять же без ошибок) не из студии, не из экзешника

проблема здесь - TValue::From<String>(list); но моих знаний точно маловато

Изменено пользователем Gingercat
Ссылка на комментарий
  • 0
Gingercat я об етом как раз и писал, приложение собирается и вылетает на старте по access violation, причем прикол обращения к AddItemToList(String list) на старте нету .
Я думал что-то я начудил, но такая же ошибка и на студийной демке. Ето надо чтобы Ярослав посмотрел.
Ссылка на комментарий
  • 0
Проблема в инициализации модулей, точнее в последовательности их инициализации.
 
FMX.Types.pas
initialization
    ...
    // <<< тут проблема, 
    // на момент вызова этого конструктора, инициализация модуля System.Rtti.pas
    // еще не выполнялась...
    // т.е. модуль System.Rtti.pas инициализируется после FMX.Types.pas
    SharedContext := TRttiContext.Create;
    ...
 
System.Rtti.pas
class function TRttiContext.Create: TRttiContext;
begin
  EnsurePoolToken(@Result.FContextToken);
end;
 
constructor TPoolToken.Create;
begin
  TMonitor.Enter(PoolLock); // вот тут то и падение, модуль еще не инициализирован и PoolLock = nil
  try
    if Pool = nil then
    begin
      Pool := TRttiPool.Create;
      PoolRefCount := 1;
    end
    else
      Inc(PoolRefCount);
  finally
    TMonitor.Exit(PoolLock);
  end;
end;
 
procedure EnsurePoolToken(TokenRef: PInterface);
var
  sample: Pointer;
 
  procedure DoCreate;
  var
    tok: IInterface;
  begin
    tok := TRttiContext.FGlobalContextToken;
    if tok = nil then
      tok := TPoolToken.Create;
    if AtomicCmpExchange(PPointer(TokenRef)^, Pointer(tok), sample) = sample then
    begin
      // We won the race to initialize the TokenRef location, so
      // zero-out interface reference without decrementing reference count.
      PPointer(@tok)^ := nil;
    end;
  end;
 
begin
  sample := PPointer(TokenRef)^;
  if sample <> nil then
    Exit;
  DoCreate;
end;
 
initialization
  ...
  PoolLock := TObject.Create;
 
Есть еще один нюанс, инициализация System.Rtti.pas зачем-то выполняется два раза,
к краху это не приведет, но небольшой (не накопительный) memleak будет.
 
Проблема в библиотеках, и похоже только Win32
 
ЗЫ. к стилям никакого отношения не имеет...
достаточно одной строчки: 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TValue::From<String>("test");
}
Изменено пользователем UniSoft
Ссылка на комментарий
  • 0

ну исходники библиотек то одни...

а вот в x64 не проявляется...

да и еще этот баг там не единственный, понизив приоритет инициализатора все запускается нормально,

но падает уже при закрытии и в каком-то другом модуле.

 

патч fmx.lib и cw32mt.lib решают проблему... 

http://rghost.net/6rNpG5LlC 

но я бы не рекомендовал это использовать, высока вероятность, 

что может начать конфликтовать с какими либо другими модулями.

 

как устроена инициализация, и о каких приоритетах идет речь, 
можно посмотреть тут: функция _init_exit_proc() 
C:\Program Files (x86)\Embarcadero\Studio\16.0\source\cpprtl\Source\startup\initexit.c 
C:\Program Files (x86)\Embarcadero\Studio\16.0\source\cpprtl\rtlinc\_startup.h 

 

по хорошему, нужно бы отправить баг-репорт, ведь баг то критический,

но у меня нет EDN аккаунта.

Изменено пользователем UniSoft
Ссылка на комментарий
  • 0

Отношу себя в сфере программирования на С++ Builder, на фоне других сообщений, к раздеду поверхностных новичков.

Огромная благодарность UniSoft!

UniSoft, это образец понимания системы в целом.

Спасибо UniSoft!

С уважением -

Лена.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...