7

次のように、VC++ 2010 アプリで FileSaveDialog (共通項目ダイアログ) を使用できます。

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 をオブジェクトに関連付けるにはどうすればよいですか?

4

2 に答える 2

5

問題は、Win XP OS を対象とするコンパイラ フラグを設定していたことです。そのため、Vista で導入された機能が定義されていません。

私は_WIN32_WINNT = 0x0501(WinXP)を持っていました。(Vista)に変更すると0x0600、IFileDialogが定義されました。

マーク、IFileDialog の定義を調べることについてのあなたの提案は、私を原因に導きました。それは私をShObjIdl.hファイルに導きましたが、 IFileDialog が定義されたセクションはグレー表示され、#if (NTDDI_VERSION >= NTDDI_VISTA)条件付きにつながりました。

ありがとう!

于 2011-03-18T20:31:24.690 に答える
1

私のVC++ 6.0は、基本パッケージでもWindows SDKでも、IFileDialogを定義していません。どこかからバックポートしましたか?

VC++ 10 の IFileDialog の定義を見てみましょう。マクロの利点を利用して定義されていると思います。そのマクロは、_declspec(uuid('...'))間違って設定されたコンパイル時定数に依存するものを含めたり除外したりします。

編集: VC++ 10 では、IFileDialog は、ShObjIdl.h の MIDL_INTERFACE マクロを使用して定義されます。MIDL_INTERFACE マクロは 3 つの異なるファイルで定義されているため、どの定義を選択しているかを判断するのは困難です。それらはすべて異なっています。ただし、定義が GUID に関連付けられない方法はありません。

GUID を含まない IFileDialog の前方定義を独自に行っている可能性はありますか?

于 2011-03-18T01:01:57.867 に答える