SHGetFileInfo вызывает повреждение кучи при использовании SHGFI_ICON
Когда я включаю Page Heap для моего тестируемого процесса, он вызывает нарушение прав доступа, которое указывает мне, что при вызове SHGetFileInfo произошел некоторый тип повреждения кучи.
В верхней части стека вызовов отображается msvcr90! Wcspbrk, а при переходе вниз он показывает связанные с COM элементы в ole32, пока не будет достигнут shell32, где мы вызываем SHGetFileInfo.
Из того, что я обнаружил в Интернете, распространенная проблема для странностей при использовании shell32 заключается не в том, чтобы сначала вызывать CoInitialize/CoInitializeEx, но в этот момент уже был вызван CoInitializeEx(), и вызов его непосредственно перед приведенным ниже кодом просто возвращает S_FALSE.
Приведенный ниже код находится в нашей DLL, которая вызывается из.NET (код используется для извлечения значка, используемого для определенного файла):
SHFILEINFOW shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfoW(A2W("C:\\logfile.txt"),
FILE_ATTRIBUTE_NORMAL,
&shfi,
sizeof(shfi),
SHGFI_USEFILEATTRIBUTES
| SHGFI_ICON
);
(где logfile.txt - произвольный текстовый файл на моем корневом диске)
Я жестко запрограммировал первый параметр в файл на моей машине для простоты.
Я использую 64-битную ОС Windows, но код запускается в 32-битном контексте. Я получаю тот же результат, если я использую узкую версию SHGetFileInfo.
Если я отключу Page Heap для своего процесса, проблем не будет.
Когда я не использую флаг SHGFI_ICON, проблема не возникает.
РЕДАКТИРОВАТЬ: @HansPassant попросил добавить воспроизводимый образец, вот ссылка на консольное приложение Visual Studio 2010 Win32, демонстрирующее проблему: пример