antarey Опубликовано 8 июля, 2015 Поделиться Опубликовано 8 июля, 2015 Есть код: //--------------------------------------------------------------------------- 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 antarey Опубликовано 8 июля, 2015 Автор Поделиться Опубликовано 8 июля, 2015 Причем, такая же проблема с примером c:\Users\Public\Documents\Embarcadero\Studio\16.0\Samples\CPP\FireMonkey Desktop\CustomListBox Переключить на релиз и убрать галки с Link with dynamik RTL & Link with runtime package получим кырдык Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 8 июля, 2015 Модераторы Поделиться Опубликовано 8 июля, 2015 а зачем эти галкт убирать? Цитата Ссылка на комментарий
0 antarey Опубликовано 8 июля, 2015 Автор Поделиться Опубликовано 8 июля, 2015 а зачем эти галкт убирать? а как интересно Вы перенесете проект на клиента? - таскать с собой пару сот метров библиотек студии Цитата Ссылка на комментарий
0 Gingercat Опубликовано 8 июля, 2015 Поделиться Опубликовано 8 июля, 2015 (изменено) Win 8.1 XE8.1 (триалка) - с отключенной линковкой собирается без проблем Изменено 8 июля, 2015 пользователем Gingercat Цитата Ссылка на комментарий
0 antarey Опубликовано 8 июля, 2015 Автор Поделиться Опубликовано 8 июля, 2015 интересно, Gingercat, а можешь собрать на 32 битах для проверки, если все нормально - придется разбираться со своей системой, мож че криво встало Цитата Ссылка на комментарий
0 Gingercat Опубликовано 8 июля, 2015 Поделиться Опубликовано 8 июля, 2015 (изменено) Хм - странное поведение. Ошибок не бъет, собирается, но при этом приложение не стартует (опять же без ошибок) не из студии, не из экзешника проблема здесь - TValue::From<String>(list); но моих знаний точно маловато Изменено 8 июля, 2015 пользователем Gingercat Цитата Ссылка на комментарий
0 antarey Опубликовано 8 июля, 2015 Автор Поделиться Опубликовано 8 июля, 2015 Gingercat я об етом как раз и писал, приложение собирается и вылетает на старте по access violation, причем прикол обращения к AddItemToList(String list) на старте нету . Я думал что-то я начудил, но такая же ошибка и на студийной демке. Ето надо чтобы Ярослав посмотрел. Цитата Ссылка на комментарий
0 UniSoft Опубликовано 8 июля, 2015 Поделиться Опубликовано 8 июля, 2015 (изменено) Проблема в инициализации модулей, точнее в последовательности их инициализации. 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"); } Изменено 10 июля, 2015 пользователем UniSoft Kitty и zairkz 2 Цитата Ссылка на комментарий
0 antarey Опубликовано 9 июля, 2015 Автор Поделиться Опубликовано 9 июля, 2015 UniSoft, проблема не только в релизе но и дебаг тоже Цитата Ссылка на комментарий
0 UniSoft Опубликовано 9 июля, 2015 Поделиться Опубликовано 9 июля, 2015 (изменено) ну исходники библиотек то одни... а вот в 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 аккаунта. Изменено 10 июля, 2015 пользователем UniSoft Kitty 1 Цитата Ссылка на комментарий
0 haword Опубликовано 10 июля, 2015 Поделиться Опубликовано 10 июля, 2015 о UniSoft тут уже ну я так понимаю сей баг будет исправлен в 9 версии студии? Цитата Ссылка на комментарий
0 antarey Опубликовано 10 июля, 2015 Автор Поделиться Опубликовано 10 июля, 2015 Написал Ярославу, говорит взяли на заметку, правда когда поправят не уточнил Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 10 июля, 2015 Поделиться Опубликовано 10 июля, 2015 Отношу себя в сфере программирования на С++ Builder, на фоне других сообщений, к раздеду поверхностных новичков. Огромная благодарность UniSoft! UniSoft, это образец понимания системы в целом. Спасибо UniSoft! С уважением - Лена. Цитата Ссылка на комментарий
0 antarey Опубликовано 10 июля, 2015 Автор Поделиться Опубликовано 10 июля, 2015 Лен, UniSoft ето уникум, сори за оффтоп Цитата Ссылка на комментарий
0 haword Опубликовано 13 июля, 2015 Поделиться Опубликовано 13 июля, 2015 — Я очень люблю ПЖ! — А я его ещё больше ку! Цитата Ссылка на комментарий
Вопрос
antarey
Есть код:
На форме StyleBook со своим стилем итемов для ЛистБокса
Все отлично работает, пока не переключаю на релиз конфигурацию и не уберу галки с Link with dynamik RTL & Link with runtime package.
Причем access violation получаю уже на старте.
Проблема в строках
В чем проблема? на ХЕ7 все работало
В атаче тестовый проект.
Test.zip
Ссылка на комментарий
15 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.