2009-03-18 4 views
1

Ich kompiliere meine Anwendung auf einer neuen Box (Vista 64) und jetzt kompiliert es nicht mehr. Der Compiler gibt mir den Fehler im Titel. Das Problem scheint (?) Zu sein, dass HWINEVENTHOOK in zweimal definiert istHilfe! Fehler C2040: 'HWINEVENTHOOK': 'DWORD' unterscheidet sich in den Ebenen der Indirektion von 'HWINEVENTHOOK__ *'

windef.h

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

und dann in winable.h ist es

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

Aber ich sah nur bis WINVER für Vista und es ist 0x0600 und Windows XP ist 0x0501 also warum ist DWORD definiert? Ich bin ratlos. Wer hilft?

Antwort

3

Nach this MSDN forum thread:

winable.h wurde aus dem Windows SDK im Juli 2005 verschoben, da Funktionalität in Winuser.h dupliziert wurde. Es war zu dieser Zeit festgestellt, dass Bemühungen wäre besser für die Aktualisierung winuser.h auf Windows Vista-Ebene Funktionalität eher als die Aktualisierung der Funktionalität der beiden Dateien ausgegeben.

Welche Version des Windows SDK verwenden Sie und welche Windows-Version ist Ihr Targeting-Code? Die Windows-Zielversion kann in einer Makefile-, Projektdatei- oder Headerdatei angegeben werden. Das Kompilieren Ihres Codes unter Vista bedeutet nicht unbedingt, dass die Zielversion Vista ist.

Haben Sie auch versucht, von winable.h zu winuser.h zu wechseln?

+0

Ok, Wechsel zu winuser.h löste es. Ich denke, ich habe beide aufgenommen. Vielen Dank. Ihre Hilfe war sehr wertvoll. Ich schätze es. –

1

Möglicherweise müssen Sie WINVER explizit auf die Version festlegen, die der von Ihnen ausgewählten Mindestversion von Windows entspricht. Ich vermute, dass der Standardwert über Win2K nicht viel ...

Sie könnten den Standardwert mit einem schnellen (ungetestet) überprüfen so hacken:

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

als Konsolenanwendung kompiliert und auf Befehl ausführen es könnte einen Hinweis geben. Sonst verbringen Sie Jahre damit, Include-Dateien zu durchforsten, um herauszufinden, wo die Standardeinstellungen festgelegt sind.

Edit: Im Allgemeinen ist es am sichersten zu immer WINVER für ein Projekt festlegen. Entweder tun Sie es in den Projekteinstellungen in Visual Studio (und für alle Builds, nicht nur den aktuellen Build!) Oder tun Sie es in einer gemeinsamen Header-Datei von jedem Modul im Projekt enthalten. Wenn Sie dies explizit tun, verringert sich die Wahrscheinlichkeit, dass eine andere Build-Umgebung eine andere Annahme hat.

+0

... und stellen Sie sicher, dass Sie denselben Wert für das Projekt festlegen, nicht nur einige Dateien! –

Verwandte Themen