1

新しいボックス (vista 64) でアプリケーションをコンパイルしていますが、コンパイルできなくなりました。コンパイラは、タイトルにエラーを表示します。問題は (?) HWINEVENTHOOK が 2 回定義されていることです。

windef.h

#if(WINVER >= 0x0400)
DECLARE_HANDLE(HWINEVENTHOOK);
#endif /* WINVER >= 0x0400 */

そしてwinable.hでは

#if WINVER < 0x0500 // these structures and functions
                    // are in NT 5.00 and above winuser.h
typedef DWORD   HWINEVENTHOOK;

ただし、vista の WINVER を調べたところ、0x0600 で、windows XP は 0x0501 であるのに、なぜ DWORD が定義されているのでしょうか? 私は途方に暮れています。誰か助けて?

4

2 に答える 2

3

このMSDNフォーラムのスレッドによると:

winuser.h で機能が重複していたため、winable.h は 2005 年 7 月に Windows SDK から移動されました。その時点で、両方のファイルの機能を更新するよりも、winuser.h を Windows Vista レベルの機能に更新することに労力を費やすほうがよいと判断されました。

使用している Windows SDK のバージョンと、コードが対象としている Windows のバージョンは? ターゲットの Windows バージョンは、メイクファイル、プロジェクト ファイル、またはヘッダー ファイルで指定できます。コードを Vista でコンパイルしても、必ずしもターゲット バージョンが Vista であるとは限りません。

また、winable.h から winuser.h に切り替えてみましたか?

于 2009-03-18T06:57:54.867 に答える
1

対象とする Windows の最小バージョンに対応するバージョンに WINVER を明示的に設定する必要がある場合があります。デフォルト値は Win2K を大きく上回っていないと思います...

次のような簡単な(テストされていない)ハックでデフォルト値を確認できます。

#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
    printf("WINVER=0x%04x\n", WINVER);
    return 0;
}

コンソール アプリとしてコンパイルし、コマンド プロンプトで実行すると、ヒントが得られる可能性があります。そうしないと、インクルード ファイルを調べて、デフォルトがどこに設定されているかを特定するのに何年も費やすことになります。

編集:一般に、プロジェクトには常にWINVER を指定するのが最も安全です。Visual Studio のプロジェクト設定 (および現在のビルドだけでなく、すべてのビルド) で行うか、プロジェクト内のすべてのモジュールに含まれる共通のヘッダー ファイルで行います。これを明示的に行うと、ビルド環境が異なれば想定が異なる可能性が低くなります。

于 2009-03-18T07:52:03.957 に答える