Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 4

ExtractIcon "падает". Странное поведение

07.04.2013, 21:03. Показов 2648. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, добрый день. Прошу помощи голову уже "сломал".
Ситуация следующая. Есть элемент управления CTreeCtrl, в нем перечень процессов. Все ОК! Решил добавить иконки для каждого процесса - для наглядности красивости (и понтов :-)...
Добавил три строчку кода для каждого элемента перед добавлением элемента в список...

hIcon = ExtractIcon( AfxGetInstanceHandle(), szExeFile, 0 );
tvItem.item.iImage = ImageList.Add ( hIconSmall );
DestroyIcon( hIcon );

И тут начинается странное поведение приложения. Во первых, иконки начал получать - но х.. поймешь что за иконки. После 10 "прогонов" (по F5) вообще стал получать сообщение "Необработанное исключение в 0x77de4621..." и выпадать в "Afxstate.cpp" AfxDeactivateActCtx.

C функцией
ExtractIconEx( szExeFile, 0, &hIconBig, &hIconSmall, 1 );
ситуация аналогичная!

Причем ставлю брейкпоинт на вызове ExtractIcon/ExtractIconEx по F5 4 раза выполняется (в цикле) на 5-ый вылетает ошибка "Необработанное исключение..."

ExtractAssociatedIcon - выполняется, но иконка у почти у всех процессов одинаковая в стиле х... поймешь.

Полное сообщение об ошибке:
Необработанное исключение в "0x77de4621" в "application.exe": 0xC015000F: Деактивируемый контекст активации не является последним активированным контекстом.

Если нажать кнопку "Пропустить", то окно программы отображается но элемент управления не растянут по высоте - не заполняет фрейм, а остается по высоте в 100 пикселей (как при создании фрейма сплиттера).

Прошу помочь - что за ошибка 0xC015000F, почему приложение "спотыкается" только при вызове ExtractIcon/ExtractIconEx?
Если можно примером работающим с извлечением иконок из файлов киньте в меня, пожалуйста.

Windows 7 x64 MSVS 2008 MFC
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2013, 21:03
Ответы с готовыми решениями:

Странное поведение if
День добрый. Работаю в VS. Столкнулся с тем, что условие if (signal.size() - len_st>0) в коде используется не правильно. В этой...

Странное поведение VS 2017
Добрый день. Заметил странное поведение студии. У меня есть две функции : LPWSTR GetCurrentPath() { wchar_t* CurrentPath; ...

Visual Studio странное поведение
Почему данный код компилируется и нормально работает в Visual Studio, не выдавая никаких ошибок? Ведь мы берем ссылку от временного...

7
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.04.2013, 21:10
Цитата Сообщение от JackyBrown Посмотреть сообщение
hIcon = ExtractIcon( AfxGetInstanceHandle(), szExeFile, 0 );
по чему не проверяешь что вернули?

Цитата Сообщение от JackyBrown Посмотреть сообщение
tvItem.item.iImage = ImageList.Add ( hIconSmall );
кто такой hIconSmall???
Цитата Сообщение от JackyBrown Посмотреть сообщение
После 10 "прогонов" (по F5) вообще стал получать сообщение "Необработанное исключение в 0x77de4621..." и выпадать в "Afxstate.cpp" AfxDeactivateActCtx.
код бы глянуть
утечка ресурсов где то
0
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 4
07.04.2013, 21:19  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
по чему не проверяешь что вернули?
кто такой hIconSmall???
код бы глянуть
утечка ресурсов где то
hIconSmall - задумался о другом месте по ошибке Small дописал (hIconSmall, hIconBig - это для ExtractIconEx - она требует две переменные HICON).

Суть, вот в чем 10 раз выполнилось и все. Перезагрузился вообще ни в какую не хочет. Комментирую кусок кода - работает. И, самое странное - ошибка. Я не могу понять что за бред. Во вторых, да не проверяю. Но ведь код "спотыкается" именно на ExtractIcon. Ни на добавлении HICON в имиджлист контрола ни при добавлении элемента treeitem в дерево, а именно на ExtractIcon.

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        if ( IsInProcessTree ( ui32Counter ) == false )
        {
            if ( FindNextParent ( ui32Counter, 0 ) > dl.GetItemCount() ) 
            {
                tvItem.hParent = 0;
                tvItem.item.pszText = pl.GetItem(ui32Counter)->szExeFile;
                
                //              hIcon = ExtractAssociatedIcon(AfxGetInstanceHandle(), pl.GetItem(ui32Counter)->szExeFile, &ui16Index );
                
                if (hIconBig)
                    DestroyIcon(hIconBig);
 
                if (hIconSmall)
                    DestroyIcon(hIconSmall);
 
                //hIcon = ExtractIcon( AfxGetInstanceHandle(), pl.GetItem(ui32StartFrom)->szExeFile, ui16Index );
                ExtractIconEx( pl.GetItem(ui32StartFrom)->szExeFile, 0, &hIconBig, &hIconSmall, (UINT)1);
                if ( hIconSmall != 0 )
                {
                    tvItem.item.iImage = ImageList.Add ( hIconSmall );
                    tvItem.item.iSelectedImage = tvItem.item.iImage;
                }
                //DestroyIcon( hIconSmall );
                //DestroyIcon( hIconBig );
 
                hItem = ptrCtrl->InsertItem ( &tvItem );
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.04.2013, 21:50
не могу сказать
на первый взгляд вроде нет криминала
поставь точку останова на проблемной функции
и смотри аргументы
что в
pl.GetItem(ui32StartFrom)->szExeFile
что в
hIconBig hIconSmall
и вообще как они у тебя описаны
там требуется массив может быть адрес меняется?

Добавлено через 3 минуты
а может у тебя спотыкается когда у процесса нет иконок
ты сначала вызови с -1 чтобы узнать количество а потом уже качай
вот кусок кода из другого форума

C++
1
2
3
4
5
6
7
8
9
10
11
LPCTSTR szFile = _T("c:\\windows\\system32\\ieframe.dll");
UINT cnt = ExtractIconEx(szFile, -1, NULL, NULL, 0);
// тут cnt == 105
if (cnt == 0) return FALSE;
HICON* arrhIcons = new HICON[cnt];
cnt = ExtractIconEx(szFile, 0, arrhIcons, NULL, cnt);
// а тут cnt == 0 !!!
for (UINT i=0; i<cnt; i++)
{
    // HICON hIcon = arrhIcons[i] - по идее текущая иконка
} // for (...
0
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 4
07.04.2013, 23:04  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение

Добавлено через 3 минуты
а может у тебя спотыкается когда у процесса нет иконок
ты сначала вызови с -1 чтобы узнать количество а потом уже качай
вот кусок кода из другого форума

C++
1
2
3
4
5
6
7
8
9
10
11
LPCTSTR szFile = _T("c:\\windows\\system32\\ieframe.dll");
UINT cnt = ExtractIconEx(szFile, -1, NULL, NULL, 0);
// тут cnt == 105
if (cnt == 0) return FALSE;
HICON* arrhIcons = new HICON[cnt];
cnt = ExtractIconEx(szFile, 0, arrhIcons, NULL, cnt);
// а тут cnt == 0 !!!
for (UINT i=0; i<cnt; i++)
{
    // HICON hIcon = arrhIcons[i] - по идее текущая иконка
} // for (...
Спасиб за совет', завтра проверю.
P.S. Знаешь, что меня коробит - это передача -1 в качестве параметра UINT у ExtractIcon.
P.P.S. Еще больше коробит маразм в C# - когда укзатель - целое со знаком. :-)
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.04.2013, 23:13
Цитата Сообщение от JackyBrown Посмотреть сообщение
Еще больше коробит маразм в C#
А причем здесь шарп???
Цитата Сообщение от JackyBrown Посмотреть сообщение
наешь, что меня коробит - это передача -1 в качестве параметра UINT у ExtractIcon.
ну напиши 0xFFFFFFFF
думаешь так проще?
1
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 4
08.04.2013, 21:30  [ТС]
Вот, только почему-то не для всех файлов выгребает иконки.
Зато результат одинаковый и для EXtractIcon и для ExtractIconEx - значит я все правильно сделал.
Подскажет кто, как получить иконки из консольных приложений и для тех файлов (nvtray.exe) для которых ExtractIcon/ExtractIconEx ничего не возвращает (для индекса 0), но для которых проводник Windows показывает их иконки?

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
HICON GetFirstIcon( unsigned __int32 ui32Index )
{
    WCHAR  strBuffer [_MAX_PATH] = { 0 };
    HICON  hIcon = 0;
    HANDLE hProcess = 0;
 
    hProcess = OpenProcess ( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, pl.GetItem(ui32Index)->th32ProcessID );
    
    if (hProcess  == 0)
        return 0;
 
    if ( GetModuleFileNameEx ( hProcess, 0, strBuffer, _MAX_PATH ) == 0 )
    {
        CloseHandle ( hProcess );
        return 0;
    }
    
    CloseHandle ( hProcess );
 
    hIcon = ExtractIcon ( 0, (LPCWSTR) strBuffer, (-1) );
 
    if ( hIcon == 0)
        return 0;
 
    return ExtractIcon ( 0, (LPCWSTR) strBuffer, 0 );
}


Функцию можно переделать, чтобы она принимала сразу путь, например. Просто я работаю с массивом данных по индексу.

Добавлено через 9 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
А причем здесь шарп???
ну напиши 0xFFFFFFFF
думаешь так проще?
Да, просто согласись, нелогично. Вот шарп я привел, только потому, что указатель - целое со знаком - чисто теоретически глупость (мое личное и глубоко субъективное мнение, менять которое я не стану ни при каких условиях). Хорошо, что не число с плавающей точкой :-)

0xFFFFFFFF - тоже логичнее для UINT, чем (-1) - потому как UINT - есть unsigned, что есть беззнаковое. И уж если быть точным UINT 0xFFFFFFFF (4294967295) не равно -1 :-)

Повторюсь, я не про техническую возможность приведения типов - нет.

Надеюсь модератор/админ не забанит за оффтоп :-)
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
08.04.2013, 23:11
Цитата Сообщение от JackyBrown Посмотреть сообщение
Подскажет кто, как получить иконки из консольных приложений и для тех файлов (nvtray.exe)
А ты уверен что там есть иконки?
посмотри любым редактором ресурсов
вполне возможно что для процессов у которых нет иконок подставляется какая нибудь " по умолчанию"
Цитата Сообщение от JackyBrown Посмотреть сообщение
0xFFFFFFFF - тоже логичнее для UINT, чем (-1) - потому как UINT - есть unsigned, что есть беззнаковое. И уж если быть точным UINT 0xFFFFFFFF (4294967295) не равно -1 :-)
ты переносишь логику машины у которой есть предел в числах на логику человека у которого нет предела
возьми например часы
два часа и четырнадцать это разные вещи
а два часа дня(пополудни) и четырнадцать это одно и тоже
так и здесь добавлено беззнаковый -1 равен знаковому 4294967295
( в 16 и 64 битных машинах значения будут другими)
я конечно не создавал эту функцию и не могу сказать как они рассуждали но прикинуть могу
номер иконок не может быть отрицательным значит вводим UINT
но нам нужно побочное действие этой функции
как его сделать?
а давай введем максимальное значение, такого номера точно не может быть
а что такое максимальное значение?
это -1 без знака
и при такой записи (UINT)-1;
мы не заставим пользователя помнить на какой разрядности он сидит
в любом случае это будет максимум
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.04.2013, 23:11
Помогаю со студенческими работами здесь

Заметил странное поведение компилятора
Здравствуйте, Коллеги. Заметил странное поведение при отладке(компилятор Visual C++ 2017). int* pi = new int(1); delete...

Странное поведение операторов new и delete
Здравствуйте! Возникла следующая проблема. В приложении MFC есть два немодальных диалога, которые обрабатываются каждое своим классом....

Странное поведение компилятора из-за слешей в пути
#include &lt;Shlobj.h&gt; #include &lt;Synchapi.h&gt; #include &lt;Psapi.h&gt; #include &lt;stdlib.h&gt; #include &lt;string&gt; //#pragma comment( linker,...

MFC/CinternetSession. Странное поведение при использовании прокси
Нужно было добавить в проект проверку валидности прокси серверов. Алгоритм работы простой: 1. Пытаюсь соединиться с конкретным сервером...

Странное поведение
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru