Far2: проблема с DM_LISTINSERT

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Far2: проблема с DM_LISTINSERT

Post by NightRoman »

DM_LISTINSERT у меня припадывает, возможно не на момент вызова, но вскоре
после. Подебажить Фар я еще не пробовал, поэтому просто всухую по коду сделаю
предположение, что Фар не копирует мой текст, а сохраняет указатель, а потом,
вероятно, пытается его удалить, хотя ЭТОТ указатель удалять должен плагин.

Вот ключевые строки из 4-х функций, где протаскивается переданный мною
указатель на строку и сохраняется живьем без копирования данных как
Item[PosAdd]->strName:

Code: Select all

case DM_LISTINSERT: // Param1=ID Param2=FarListInsert
..
  if((Ret=ListBox->InsertItem((struct FarListInsert *)Param2)) == -1)

int VMenu::InsertItem(const struct FarListInsert *NewItem)
..
  if (AddItem(FarList2MenuItem(&NewItem->Item,&MItem),NewItem->Index) >= 0)

struct MenuItemEx *VMenu::FarList2MenuItem(const FarListItem *FItem,
..
  MItem->strName = FItem->Text;

int VMenu::AddItem(const MenuItemEx *NewItem,int PosAdd)
..
  Item[PosAdd]->strName = NewItem->strName;
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

Не знаю, в кассу ли, но добавлю, что DM_LISTUPDATE я не проверял, ибо не использую. По некой "логике" там может оказаться схожий код и, возможно, проблема. Может и нет, конечно.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by t-rex »

NightRoman
Что то я вообще нифига не понял, в чём именно проблема?
Ибо в том коде что ты показал всё нормально
MItem->strName = FItem->Text;
эта строка аллоцирует память и копирует туда твою строку (strName это string).
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

t-rex
Ах вот оно что, что ж, недоглядел, говорю, что просто всухую по сорсу лазил, даже не в студии. Проблема в том, что это дело падает при вызове DM_LISTINSERT. Причина падения, по-твоему, получается не та, что я думал. Бывает.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by t-rex »

Ну сделай мини плагин на C в котором падает и будем разбиратся.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

Проблема, похоже, наведенная и совсем не там (впрочем, это мы выяснили). Подебажил немного. Припадывает, например, тут:

Code: Select all

void VMenu::ShowMenu(int IsParent)
..
  if (SelectPos<ItemCount)
  {
    if(Item[SelectPos]->Flags&LIF_DISABLE)
      Item[SelectPos]->Flags&=~LIF_SELECTED;
    else
      Item[SelectPos]->Flags|=LIF_SELECTED;
  }
когда SelectPos = -1. Откуда эта -1 я пока не выяснил, может и плуг виноват, а может и Фар. Если такой код в Фар добавить после ".." в коде выше

Code: Select all

if (SelectPos < 0)
  SelectPos = 0;
то падения в моем случае прекращаются.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by t-rex »

NightRoman
Ты лучше научи как повторить падение.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

Плагин на С я предоставить не могу сейчас. Могу выслать рабочую версию FarNet + PowerShellFar и скрипт, который вызывает падение. Если не годится, могу просто описать действия скрипта. Это тестовый скрипт, чтоб выявлять проблемы, с чем он справился. Он делает полную пургу, но абсолютно законную.

Code: Select all

# remove all items
$box.Clear() # [_090208_042536]

# create and add new items with some random properties
$num = 1000
$rnd = New-Object Random 3
for($$ = 0; $$ -lt $num; ++$$) {
	$box.Items.Add((
		New-FarItem -Text $$ -Checked:($rnd.Next(2)) -Disabled:($rnd.Next(2))
	))
}

# remove some items randomly
for($$ = $num; --$$ -ge 0;) {
	if ($rnd.Next(2)) {
		$box.Items.RemoveAt($$)
	}
}

# set a random current item
$box.Selected = $rnd.Next($num)
Надо перевести это на человеческий язык или действия понятны и так?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

Еще немного подробностей. Подебажил сам этот скрипт в PowerShellFar, выяснил, что падает прямо на первом вызове $box.Items.Add, что внутри вызывает DM_LISTINSERT. Что было до вызова скрипта - список с какими-то элементами, которые в него попали не динамически, а прямо с инициализации диалога. Теперь значит, вызываем удаление всех элементов DM_LISTDELETE и потом начинаем добавлять с DM_LISTINSERT. Вот такая получается последовательность.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by t-rex »

NightRoman
Запиши на мантис.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

Пофиксите, пожалуйста. Все-таки падение. Или приостановите, как предложено выше.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

?
User avatar
Alexey Samlyukov
Posts: 1765
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 7 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by Alexey Samlyukov »

спасение утопающего - дело рук самого утопающего :P
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far2: проблема с DM_LISTINSERT

Post by NightRoman »

Пословицы и поговорки. Я тоже знаю. "У семи нянек - дитя без глаза". Одной самоспасающейся утопающей нянькой больше - это еще не значит, что будет лучше и правильнее. Плохое-ли хорошее-ли, но тут сообщество единомышленников, поэтому на помощь расчитывать - не такая уж бредовая идея.
Post Reply

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