Помогите! ошибка C2040: «HWINEVENTHOOK»: «DWORD» отличается по уровням косвенности от «HWINEVENTHOOK__ *» - PullRequest
1 голос
/ 18 марта 2009

Я компилирую свое приложение в новом окне (Vista 64) и теперь оно больше не компилируется. Компилятор выдает ошибку в заголовке. Проблема (?) В том, что HWINEVENTHOOK определяется дважды в

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;

Тем не менее, я только что посмотрел WINVER для Vista, и это 0x0600 и Windows XP 0x0501, так почему же определяется DWORD? Я в недоумении. Кто-нибудь поможет?

Ответы [ 2 ]

3 голосов
/ 18 марта 2009

Согласно этой ветке форума MSDN :

winable.h был перенесен из Windows SDK в июле 2005 года, потому что функциональность был продублирован в winuser.h. это было определил в то время, что усилия лучше потратить на обновление winuser.h до уровня Windows Vista функциональность, а не обновление функциональность обоих файлов.

Какую версию Windows SDK вы используете и на какую версию Windows нацелен ваш код? Целевая версия Windows может быть указана в make-файле, файле проекта или файле заголовка. Компиляция вашего кода в Vista не обязательно означает, что целевой версией является Vista.

Кроме того, вы пытались перейти с winable.h на winuser.h?

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

Возможно, вам потребуется явно установить WINVER на версию, соответствующую минимальной версии Windows, на которую вы ориентируетесь. Я подозреваю, что его значение по умолчанию не намного выше Win2K ...

Вы можете проверить его значение по умолчанию с помощью быстрого (непроверенного) хака, подобного этому:

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

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

Редактировать: Как правило, всегда безопаснее всего указывать WINVER для проекта. Либо сделайте это в настройках проекта в Visual Studio (и для всех сборок , а не только в текущей сборке!) Или сделайте это в общем заголовочном файле, включаемом каждым модулем в проекте. Это явным образом уменьшит вероятность того, что различные среды сборки могут иметь разные предположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...