com — Использование IFileDialog и SHBrowseForFolder одновременно в переполнении стека

У меня проблема со вчерашнего утра, которая сводит меня с ума.

Проблема в том, что я хочу создать диалог для поиска папки.
Для каждой ОС старше Vista я использую метод SHBrowseForFolder (), который работает нормально (также для Vista и новее).

Для Vista и новее я хотел бы использовать IFileDialog из-за производительности, более приятного графического интерфейса и т. Д.

Когда я пытаюсь скомпилировать реализованный код для IFileDialog, я получаю следующую ошибку «Без GUID»:

Код:

IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));

Ошибка:

error C2787: 'IFileDialog' : no GUID has been associated with this object

В разговоре с моим боссом он сказал мне, что мы не можем установить флаг компилятора на vista и выше из-за совместимости с XP. Проблема была решена здесь с установкой флага компилятора: Как использовать iFileDialog в проекте VC ++ 2010, преобразованном из VC ++ 6.0?

Можно ли в любом случае использовать IFileDialog? Может быть, класс может быть связан динамически?

Не могли бы вы дать мне совет о том, как реализовать?
Заранее спасибо.

1

Решение

Вам нужно использовать __uuidof (…) для создания этого объекта:

IFileDialog *pFileDialog;
hr = CoCreateInstance(__uuidof(FileDialog), NULL, CLSCTX_ALL,
__uuidof(pFileDialog), reinterpret_cast<void**>(&pFileDialog));
0

Другие решения

Если вы хотите компилировать код, который использует более высокий SDK (после XP), вам нужно установить соответствующий WINVER.

Выполнение этого для всего проекта не будет работать, но выполнение этого для этого модуля, который должен работать для более поздних версий ОС Windows, чем XP, должно работать.

Установка WINVER на более высокую версию, чем XP, для одного из модулей не должна быть проблемой, если вы не используете функции, которые недоступны в XP.

0

По вопросам рекламы [email protected]