Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
Nemo
Posts: 13
Joined: Fri 17 Apr, 2026 04:19
Has thanked: 1 time

Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Post by Nemo »

Far 3.0.6446.0 x64
Слетает, в 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)

Post by Shmuel »

  • Far 3.0.6694.0 x64 (самый свежий на данный момент).
  • DM_LISTADDSTR у меня работает нормально, не вылетает.
  • DN_LISTADDSTR не должно компилироваться, т.к. его нет в plugin.hpp.
  • Если диалог и сообщение в разных потоках, то это вроде не допустимо по документации.
User avatar
Nemo
Posts: 13
Joined: Fri 17 Apr, 2026 04:19
Has thanked: 1 time

Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Post by Nemo »

DN_LISTADDSTR и не обрабатывается
переделал. Теперь в одном потоке 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)

Post by Shmuel »

На варианте с 35 строками -падает
Добавил в цикле 1000 строк (на одном событии DN_BTNCLICK), не падает.
╔═══════════════════════════════ TEST ═══════════════════════════════╗ ║ ╔═══════════════ Мой клёвый Листбокс ════════════════╗ ║ ║ ║ Добавленная строка # 992 ▲ [ Add ] ║ ║ ║ Добавленная строка # 993 ░ [ Add Str ] ║ ║ ║ Добавленная строка # 994 ░ [ Del.Str ] ║ ║ ║ Добавленная строка # 995 ░ [ Update ] ║ ║ ║ Добавленная строка # 996 ░ ║ ║ ║ Добавленная строка # 997 ░ ║ ║ ║ Добавленная строка # 998 ░ ║ ║ ║ Добавленная строка # 999 █ ║ ║ ║ Добавленная строка # 1000 ▼ ║ ║ ╚════════════════════════════════════════════════════╝ ║ ╟────────────────────────────────────────────────────────────────────╢ ║ { Ok } [ Cancel ] ║ ╚════════════════════════════════════════════════════════════════════╝
User avatar
Nemo
Posts: 13
Joined: Fri 17 Apr, 2026 04:19
Has thanked: 1 time

Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Post by Nemo »

Вариант с 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];
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)

Post by Shmuel »

Если проблема ещё не разрешилась, можете выложить минимальный, но достаточный, компилируемый пример для воспроизведения ошибки (то есть падения).
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)

Post by Yegor »

Дайте мне сморозить что-нибудь, вам нужно удостоверится что время жизни вашего 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) Мичурин
2useven10
Posts: 5507
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 22 times
Been thanked: 355 times

Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Post by 2useven10 »

Вот не удивлюсь, если там вообще нет никакой инициализации первых 2000.
А весь код в сообщении выше.
User avatar
Nemo
Posts: 13
Joined: Fri 17 Apr, 2026 04:19
Has thanked: 1 time

Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Post by Nemo »

Вопрос закрыт
User avatar
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)

Post by HaRT »

Nemo wrote: Sun 14 Jun, 2026 20:48Вопрос закрыт
Так вы хоть напишите для тех, кто будет идти по сходному пути, в чём была проблема и как удалось её решить. Именно так польза от этой темы для сообщества будет наибольшей.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Nemo
Posts: 13
Joined: Fri 17 Apr, 2026 04:19
Has thanked: 1 time

Фатальная ошибка по SendDlgMessage (hdlg, DM_LISTADDSTR, 1, sp)

Post by Nemo »

Повреждение кучи было вызвано временем жизни динамической памяти под выделяемые строки.
В модальном этот вопрос локализован и не критичен. В немодальном диалоге иначе - существенен вопрос времени жизни элементов диалога., которое должно быть не менее времени жизни основного диалога.
Для обеспечения этого существуют 2 варианта:
1.Статическое распределение памяти под элементы диалога.
2.Динамическое, но с с верифицированным временем жизни элементов диалога.
FAR потоконебезепасно работает со строками. При многопоточной работе с элементами диалога (в частности строками) безопаснее эти действия перенести в основной поток FAR. Для этого существует ProcessSynchroEventW.
Post Reply

Return to “Разработка плагинов”