Exception в SHGetFileInfo. Вопрос к специалистам WINAPI.
От: bespalovdn  
Дата: 14.10.09 07:54
Оценка:
Всем привет!
У меня проблема с использованием вышеназванной функции в моей программе, и я никак не могу найти хоть сколько -нибудь похожую проблему и её решение в интернете. Суть в следующем. Для получения иконки файла я использую функцию SHGetFileInfo вот таким образом:

SHFILEINFO fi = {0};
::SHGetFileInfo( fileName.c_str(), // Здесь полное имя файла, включая путь к нему
   fileAttributes, // Здесь атрибуты файла полученные с WIN32_FIND_DATA.dwFileAttributes
   &fi, sizeof(SHFILEINFO), 
   SHGFI_ICON | SHGFI_SMALLICON | SHGFI_ADDOVERLAYS | SHGFI_USEFILEATTRIBUTES );


"Особенность" состоит в том, что функция вызывается в отдельном от основного окна потоке. А проблема моя в том, что при каждом вызове этой функции внутри неё происходит исключение, которое в моём output-окне в отладчике выглядит следующим образом:
First-chance exception at 0x7c812a5b in FM.exe: Microsoft C++ exception: GCError @ 0x0171ef98.
First-chance exception at 0x7c812a5b in FM.exe: Microsoft C++ exception: [rethrow] @ 0x00000000.
Исключение видимо успешно ловится внутри самой функции, и стэк не разворачивается за её пределами, то есть мой код после её вызова идёт дальше нормально, и можно было бы закрыть глаза на этот косяк и забить. Но это исключение каким-то образом влияет на очередь асинхронных сообщений в основном потоке, и я их попросту теряю.
В ходе экспериментов с передаваемыми в неё флагами, удалось выяснить, что исключение не генерится, если убрать флаг SHGFI_ADDOVERLAYS.
Но это еще не всё. Проблема с исключением в этой функции проявляется на моей рабочей 2-х ядерной машине, однако дома на одноядерной тачке всё замечательно, ни каких исключений в SHGetFileInfo, никаких потерь асинхронных сообщений в основном потоке.

Буду очень признателен всем откликнувшимся.
Здесь вы можете разместить вашу рекламу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.