Probleme mit #include <Windows.h>



  • Hi,

    ich schreibe gerade eine Klasse welche mir den Zugriff auf die Registry etwas erleichtert. Diese Klasse soll sowohl in MFC Projekten, als auch in "normalen" Win32 Projekten funktionieren, was an sich auch kein Problem sein sollte, da ich innerhalb der Klasse keine MFC Routinen benutze.

    Da man ja in MFC die "Windows.h" nicht inkludieren soll/kann, und ich meine Klasse möglichst ohne Veränderung in mehreren Projekten verwenden will habe ich folgendes in den Header meiner Klasse geschrieben:

    #ifndef _MFC_VER
    #include <Windows.h>
    #endif
    

    Das muss in den Header, da die Klasse sowohl unter Unicode-Umgebungen als auch unter "normalen" Umgebungen funktionieren soll, und ich daher den Typ TCHAR im Header benutze, welcher entweder als wchar_t oder als char definiert ist.

    Nur leider bekomme ich immer noch den Error:

    error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
    

    Meine Frage:
    Wieso? 🙂

    /Edit: Ach ja, als Compiler benutze ich Visual Studio 2010 Ultimate, bin Student, daher kostenlos 😉



  • Hm, vielleicht liegt's an der include-Reihenfolge. Eventuell würde es ja helfen, dein include weiter unten zu platzieren.

    Aber du könntest doch auch einfach eine lib/dll basteln.



  • Die Windows.h ist die einzige Datei die ich include, und ne DLL wär ein bischen Overkill für eine Klasse.

    Gruß,
    Marius



  • tchar.h ?



  • tchar.h is zwar ne Lösung für TCHAR, aber nicht für DWORD und PHKEY usw.

    Ich würde sowieso lieber wissen warum meine gepostete Lösung oben nicht funktioniert, schließlich dürfte die Windows.h doch gar nicht eingebunden werden weil _MFC_VER bei MFC ja definiert ist.



  • Mir war dieses Problem bislang gar nicht bewusst, da wir hier auch MFC-Projekte haben, in denen windows.h problemlos inkludiert wird.

    Ich habe eben das hier gefunden:

    Or include 'stdafx.h' before any inclusion of 'windows.h'...

    (Quelle: http://www.codeguru.com/forum/showthread.php?t=355696)

    Inkludierst du irgendwo stdafx.h? Stimmt da vielleicht doch die Reihenfolge nicht?


  • Mod

    #ifndef _MFC_VER 
    #include <Windows.h> 
    #endif
    

    Darf natürlich niemals vor einem #include "afx.h" stehen. Sonst bekommst Du natürlich den Fehler.



  • RedPuma schrieb:

    tchar.h is zwar ne Lösung für TCHAR, aber nicht für DWORD und PHKEY usw.

    Ich würde sowieso lieber wissen warum meine gepostete Lösung oben nicht funktioniert, schließlich dürfte die Windows.h doch gar nicht eingebunden werden weil _MFC_VER bei MFC ja definiert ist.

    Daher muss es ja so sein, dass dein include-statement kommt, bevor _MFC_VER definiert wird...



  • Also, ich dachte eigentlich das der Compiler afxwin.h bei MFC Projekten automatisch includiert. Das dachte ich weil mein Klassenheader, welcher ursprünglich keine Header includiert hat, ohne Probleme kompiliert wurde.
    Das lag aber daran, dass ich den Header in einer CPP Datei eingebunden hatte, und zwar unter der Einbindung von <afxwin.h>.

    Wieder zurück zu meinem Header:
    Wenn ich <afxwin.h> vor das oben genannte Codefragment stelle wird Windows.h nicht mehr eingebunden, der Code compiliert tadellos. Das ist aber entgegen meiner eigentlichen Intention, da ich afxwin.h bei einem nicht-MFC Projekt ja gar nicht brauche, bzw. auf einem Express Compiler auch gar nicht zur Verfügung habe.
    Warum definiert MS nicht standardgemäß bei nem MFC Projekt schon in den Projekt-Eigenschaften eine Präprozessor Direktive für MFC...

    Naja egal, jetz werd ichs wohl über ne selbstgemachte globale Präprozessor Direktive machen.

    Gruß,
    Marius


  • Mod

    Eigentlich bauchst Du Dich garnicht drum zu kümmenr. Jeder halbwegs vernünftige Enwtickler hat die afx.h im stdafx.h included genauso wie die Windows.h

    Alle meine Module fangen mit einem #include "stdafx.h" an. Dabei gehe ich davon aus, dass entweder die afx.h oder eben die windows.h hier included werden...



  • Ist bei mir genauso, deswegen lass ich das mit dem Präprozessor auch sein, ich include die CRegistry.h (so heißt mein Header) einfach immer nach StdAfx.h (wies ja ganz normal ist). Mein Fehler war dass ich die CRegistry.h im StdAfx.h Header drin hatte, allerdings vor winafx.h.

    Gruß,
    Marius


Anmelden zum Antworten