Как использовать iFileDialog в проекте VC ++ 2010, преобразованном из VC ++ 6.0? - PullRequest
6 голосов
/ 18 марта 2011

Я могу использовать FileSaveDialog (Common Item Dialog) в приложении VC ++ 2010, например:

IFileDialog *pFileDialog;
HRESULT hr = CoCreateInstance(CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFileDialog));    

, но когда я помещаю этот код в свой проект, который был преобразован из VC ++ 6.0 в VC ++2010 Я получаю следующую ошибку:

"ошибка C2787: 'IFileDialog': с этим объектом не связан ни один GUID"

Я также получаю красное загорание подМакрос IID_PPV_ARGS и ошибка перехода:

"Операнд _uuidof должен иметь класс или тип перечисления, для которого указан _declspec (uuid ('...'))"

Я НЕ использую поддержку общего языка (/ clr) в любом из проектов.

Как связать GUID с моим объектом?

Ответы [ 2 ]

5 голосов
/ 18 марта 2011

Проблема заключалась в том, что я установил флаг компилятора для ОС Win XP.Вот почему функция, представленная в Vista, не была определена.

У меня было _WIN32_WINNT = 0x0501 (WinXP).Когда я изменил его на 0x0600 (Vista), был определен IFileDialog.

Марк, ваше предложение о просмотре определения IFileDialog привело меня к причине.Это привело меня к файлу ShObjIdl.h, но раздел, где был определен IFileDialog, был недоступен, что привело меня к условному условию #if (NTDDI_VERSION >= NTDDI_VISTA).

Спасибо!

1 голос
/ 18 марта 2011

Мой VC ++ 6.0 не определяет IFileDialog, ни в базовом пакете, ни в Windows SDK. Ты откуда-то портировал его обратно?

Я бы посмотрел определение IFileDialog в VC ++ 10. Я предполагаю, что оно определено с помощью некоторого макроса, и этот макрос включает или исключает _declspec(uuid('...')) в зависимости от некоторой постоянной времени компиляции, которая установлена ​​неправильно.

Редактировать: В VC ++ 10 IFileDialog определяется с помощью макроса MIDL_INTERFACE, в ShObjIdl.h. Макрос MIDL_INTERFACE определен в 3 разных файлах, поэтому сложно определить, какое определение вы выбираете; они все разные. Однако я не вижу способа, чтобы определение не было связано с GUID.

Возможно ли, что вы самостоятельно делаете предварительное определение IFileDialog, которое не содержит GUID?

...