Всем привет!
У меня проблема с использованием вышеназванной функции в моей программе, и я никак не могу найти хоть сколько -нибудь похожую проблему и её решение в интернете. Суть в следующем. Для получения иконки файла я использую функцию 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, никаких потерь асинхронных сообщений в основном потоке.
Буду очень признателен всем откликнувшимся.