Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Far 3.0.6446.0 x64
Слетает, в 90% случаев без вызова каких либо сообщений и записи краш-лога
Диалог и сообщение в разных потоках
Строка и ссылка на неё не пустые
"DN_LISTADDSTR" не обрабатывается
?????
Слетает, в 90% случаев без вызова каких либо сообщений и записи краш-лога
Диалог и сообщение в разных потоках
Строка и ссылка на неё не пустые
"DN_LISTADDSTR" не обрабатывается
?????
Last edited by Nemo on Mon 08 Jun, 2026 16:39, edited 1 time in total.
-
Shmuel
- Posts: 7254
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 48 times
- Been thanked: 636 times
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
- Far 3.0.6694.0 x64 (самый свежий на данный момент).
- DM_LISTADDSTR у меня работает нормально, не вылетает.
- DN_LISTADDSTR не должно компилироваться, т.к. его нет в plugin.hpp.
- Если диалог и сообщение в разных потоках, то это вроде не допустимо по документации.
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
DN_LISTADDSTR и не обрабатывается
переделал. Теперь в одном потоке DM_LISTADDSTR
Всё равно улетает
======================================================================
Exception: 0xC0000374 - STATUS_HEAP_CORRUPTION
Details: 0xC0000374 - Куча была повреждена.
======================================================================
Где определяется куча для DI_LISTBOX не ясно
--
когда строк немного - работает
На варианте с 35 строками -падает
переделал. Теперь в одном потоке DM_LISTADDSTR
Всё равно улетает
======================================================================
Exception: 0xC0000374 - STATUS_HEAP_CORRUPTION
Details: 0xC0000374 - Куча была повреждена.
======================================================================
Где определяется куча для DI_LISTBOX не ясно
--
когда строк немного - работает
На варианте с 35 строками -падает
Last edited by Nemo on Mon 08 Jun, 2026 18:02, edited 2 times in total.
-
Shmuel
- Posts: 7254
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 48 times
- Been thanked: 636 times
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Добавил в цикле 1000 строк (на одном событии DN_BTNCLICK), не падает.На варианте с 35 строками -падает
╔═══════════════════════════════ TEST ═══════════════════════════════╗ ║ ╔═══════════════ Мой клёвый Листбокс ════════════════╗ ║ ║ ║ Добавленная строка # 992 ▲ [ Add ] ║ ║ ║ Добавленная строка # 993 ░ [ Add Str ] ║ ║ ║ Добавленная строка # 994 ░ [ Del.Str ] ║ ║ ║ Добавленная строка # 995 ░ [ Update ] ║ ║ ║ Добавленная строка # 996 ░ ║ ║ ║ Добавленная строка # 997 ░ ║ ║ ║ Добавленная строка # 998 ░ ║ ║ ║ Добавленная строка # 999 █ ║ ║ ║ Добавленная строка # 1000 ▼ ║ ║ ╚════════════════════════════════════════════════════╝ ║ ╟────────────────────────────────────────────────────────────────────╢ ║ { Ok } [ Cancel ] ║ ╚════════════════════════════════════════════════════════════════════╝
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Вариант с SendDlgMessage(DM_LISTINSERT, 1, &listPos);
тот же крендель
Exception: 0xC0000374 - STATUS_HEAP_CORRUPTION
Details: 0xC0000374 - Куча была повреждена.
errno: 0x00000000 - No error
LastError: 0x000000B7 - Невозможно создать файл, так как он уже существует.
NTSTATUS: 0xC000000D - Службе или функции передан неверный параметр.
Address: +000FF489 ntdll.dll!RtlIsZeroMemory+0x119
Location: vectored_exception_handler_impl, exception_handler.cpp(2277)
Module: C:\Program Files\Far Manager\Far.exe
-----
Вариант с
FarList lst = {sizeof(FarList), 2000, nullptr};
lst.Items = new FarListItem[2000];
sendMsg(DM_LISTSET, 1, &lst);
и далее:
FarListInsert listPos = {sizeof(FarListInsert), 2000, {0, msgstr, 0}};
SendDlgMessage(hdlg, DM_LISTINSERT, 1, &listPos);
или
SendDlgMessage(hdlg, DM_LISTADDSTR, 1, msgstr);
улетает в 100% в фатал
---
Диалог немодальный. Память под элементы диалога выделяется
conitems = new FarDialogItem[2];
тот же крендель
Exception: 0xC0000374 - STATUS_HEAP_CORRUPTION
Details: 0xC0000374 - Куча была повреждена.
errno: 0x00000000 - No error
LastError: 0x000000B7 - Невозможно создать файл, так как он уже существует.
NTSTATUS: 0xC000000D - Службе или функции передан неверный параметр.
Address: +000FF489 ntdll.dll!RtlIsZeroMemory+0x119
Location: vectored_exception_handler_impl, exception_handler.cpp(2277)
Module: C:\Program Files\Far Manager\Far.exe
-----
Вариант с
FarList lst = {sizeof(FarList), 2000, nullptr};
lst.Items = new FarListItem[2000];
sendMsg(DM_LISTSET, 1, &lst);
и далее:
FarListInsert listPos = {sizeof(FarListInsert), 2000, {0, msgstr, 0}};
SendDlgMessage(hdlg, DM_LISTINSERT, 1, &listPos);
или
SendDlgMessage(hdlg, DM_LISTADDSTR, 1, msgstr);
улетает в 100% в фатал
---
Диалог немодальный. Память под элементы диалога выделяется
conitems = new FarDialogItem[2];
Last edited by Nemo on Mon 08 Jun, 2026 20:19, edited 3 times in total.
-
Shmuel
- Posts: 7254
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 48 times
- Been thanked: 636 times
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Если проблема ещё не разрешилась, можете выложить минимальный, но достаточный, компилируемый пример для воспроизведения ошибки (то есть падения).
-
Yegor
- Posts: 1509
- Joined: Mon 04 Apr, 2005 13:41
- Location: San Ramon, CA / Kharkov, UA
- Has thanked: 52 times
- Been thanked: 94 times
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Дайте мне сморозить что-нибудь, вам нужно удостоверится что время жизни вашего
msgstr для каждого элемента, переживет время жизни диалога, т.к. по-моему Far не копирует вашу строку при создании FarList, а сохраняет только указатель.Code: Select all
for (int n = 1; n <= 2000; ++n)
{
std::string msgstr = "test " + std::to_string(n);
SendDlgMessage(hdlg, DM_LISTADDSTR, 1, msgstr.c_str()); // так не надо делать!
}Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
- HaRT
- Moderator
- Posts: 11479
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 272 times
- Been thanked: 418 times
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Так вы хоть напишите для тех, кто будет идти по сходному пути, в чём была проблема и как удалось её решить. Именно так польза от этой темы для сообщества будет наибольшей.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)
Повреждение кучи было вызвано временем жизни динамической памяти под выделяемые строки.
В модальном этот вопрос локализован и не критичен. В немодальном диалоге иначе - существенен вопрос времени жизни элементов диалога., которое должно быть не менее времени жизни основного диалога.
Для обеспечения этого существуют 2 варианта:
1.Статическое распределение памяти под элементы диалога.
2.Динамическое, но с с верифицированным временем жизни элементов диалога.
FAR потоконебезепасно работает со строками. При многопоточной работе с элементами диалога (в частности строками) безопаснее эти действия перенести в основной поток FAR. Для этого существует ProcessSynchroEventW.
В модальном этот вопрос локализован и не критичен. В немодальном диалоге иначе - существенен вопрос времени жизни элементов диалога., которое должно быть не менее времени жизни основного диалога.
Для обеспечения этого существуют 2 варианта:
1.Статическое распределение памяти под элементы диалога.
2.Динамическое, но с с верифицированным временем жизни элементов диалога.
FAR потоконебезепасно работает со строками. При многопоточной работе с элементами диалога (в частности строками) безопаснее эти действия перенести в основной поток FAR. Для этого существует ProcessSynchroEventW.