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, демонстрирующее проблему: пример

0 ответов

Другие вопросы по тегам