1

Windows 7 の Visual Studio 2010 でプログラムをコンパイルしようとしています。コンパイル エラーC2061: syntax error: identifier 'KNOWN_FOLDER_FLAG'が Windows ヘッダーの次shlobj.hのマークされた行に表示されます。

#if (NTDDI_VERSION >= NTDDI_VISTA)

typedef enum
{
    KF_FLAG_DEFAULT         = 0x00000000,
    KF_FLAG_CREATE          = 0x00008000,
    KF_FLAG_DONT_VERIFY     = 0x00004000,
    KF_FLAG_DONT_UNEXPAND   = 0x00002000,
    KF_FLAG_NO_ALIAS        = 0x00001000,
    KF_FLAG_INIT            = 0x00000800,
    KF_FLAG_DEFAULT_PATH    = 0x00000400,
    KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200,
    KF_FLAG_SIMPLE_IDLIST   = 0x00000100,
    KF_FLAG_ALIAS_ONLY      = 0x80000000,
} KNOWN_FOLDER_FLAG;


DEFINE_ENUM_FLAG_OPERATORS(KNOWN_FOLDER_FLAG);

STDAPI SHGetKnownFolderIDList(__in REFKNOWNFOLDERID rfid,
                              __in DWORD /* KNOWN_FOLDER_FLAG */ dwFlags,
                              __in_opt HANDLE hToken,
                              __deref_out PIDLIST_ABSOLUTE *ppidl);

STDAPI SHSetKnownFolderPath(__in REFKNOWNFOLDERID rfid,
                            __in DWORD /* KNOWN_FOLDER_FLAG */ dwFlags,
                            __in_opt HANDLE hToken,
                            __in PCWSTR pszPath);

STDAPI SHGetKnownFolderPath(__in REFKNOWNFOLDERID rfid,
                            __in DWORD /* KNOWN_FOLDER_FLAG */ dwFlags,
                            __in_opt HANDLE hToken,
                            __deref_out PWSTR *ppszPath);

#endif  // NTDDI_VISTA

#if (NTDDI_VERSION >= NTDDI_WIN7)

STDAPI SHGetKnownFolderItem(__in REFKNOWNFOLDERID rfid,
                            __in KNOWN_FOLDER_FLAG flags, <<<ERROR AT THIS LINE
                            __in_opt HANDLE hToken,
                            __in REFIID riid,
                            __deref_out void **ppv);
#endif // NTDDI_WIN7

私のプログラムでは、バージョンマクロは次のように定義されています

#define NTDDI_VERSION NTDDI_WINXP

コンパイルされない理由は何ですか?

エラーが発生している部分はまったくコンパイルしてはいけないように思えますが、どういうわけかそうです。

4

3 に答える 3

1

編集: コード サンプルを下にスクロールせずに私の回答が書かれました.SHGetKnownFolderItem を定義する行からエラーが発生していることを確認しましたか? この種の問題が発生した場合、通常、ファイルのプリプロセッサ出力ファイルを作成し、エラーが実際に予想される場所から発生していることを確認します。NTDDI_VERSION が適切に保護されていないコードが他にある可能性があります。

Windows SDK ヘッダーは、特定のバージョンの Windows 用のアプリケーションを構築できるように構築されています。

この場合、(NTDDI_VERSION を NTDDI_WINXP に設定することによって) Windows XP 用のアプリケーションをビルドするように要求しています。それは素晴らしいことです。しかし、Windows Vista で導入された列挙型 (KNOWN_FOLDER_FLAG) を使用しようとしています。

Windows API の Windows Vista バージョンを使用して (NTDDI_VERSION を NTDDI_VISTA に設定して) アプリケーションをビルドするか、Windows Vista 固有の機能を分離する別の方法を見つける必要があります。

それにはいくつかの方法があります。最初の (そして最もトリッキーな) 方法は、Vista ヘッダーを使用してアプリをビルドし、XP で Vista のみの機能を使用しないように注意することです。または、vista 固有の機能を別のソース ファイル/dll に分離し、そのファイルを NTDDI_VISTA でコンパイルすることもできます。次に、XP を使用していない場合にのみ、Vista 固有の機能を呼び出します。

SHGetKnownFolderPath への直接呼び出しをアプリケーションに追加すると、Windows XP では機能しないことに注意してください。これは、その API が XP に存在しないためです。そのため、LoadLibrary/GetProcAddress トリックを実行して API を呼び出す必要があります。

于 2012-05-24T15:28:04.280 に答える
1

論理的な結論は 1 つだけです。何らかの理由でNTDDI_VERSION、このヘッダーがコンパイルされたときの展開は、あなたが考えているものではありません。

プロジェクトのクリーン ビルドを検索して作成することで、トラブルシューティングを試み#undef NTDDI_VERSIONます (プリコンパイル済みヘッダーを使用している場合に関連する可能性があります)。

于 2012-05-24T13:25:40.603 に答える
0

変化する

NTDDI_VERSION NTDDI_WINXP を定義する

NTDDI_VERSION NTDDI_VISTA を定義する

宣言の前に、ShlObjヘッダーはWindows 10で正常に動作します

于 2017-04-16T09:50:44.473 に答える