• 0
antarey

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

Вопрос

Есть код:

//---------------------------------------------------------------------------
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

15 ответов на этот вопрос

  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

а зачем эти галкт убирать?

а как интересно Вы перенесете проект на клиента? - таскать с собой пару сот метров библиотек студии

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Win 8.1 XE8.1 (триалка) - с отключенной линковкой собирается без проблем

 

5821578m.png

 

 

Изменено пользователем Gingercat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

интересно, Gingercat, а можешь собрать на 32 битах для проверки, если все нормально - придется разбираться со своей системой, мож че криво встало

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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
zairkz и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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
Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

о UniSoft тут уже  :D

 

ну я так понимаю сей баг будет исправлен в 9 версии студии? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Написал Ярославу, говорит взяли на заметку, правда когда поправят не уточнил :)

Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

Спасибо UniSoft!

С уважением -

Лена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Лен, UniSoft ето уникум, сори за оффтоп

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
— Я очень люблю ПЖ!

— А я его ещё больше ку!

 

 

:D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу