• 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

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


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

о UniSoft тут уже  :D

 

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

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


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

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

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


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

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

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

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

Спасибо UniSoft!

С уважением -

Лена.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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