WIN32_LEAN_AND_MEAN und VC_EXTRALEAN



  • Wo liegt den der Unterschied zwischen

    WIN32_LEAN_AND_MEAN und VC_EXTRALEAN

    Wenn ich eine DLL mit dem Visual Studio Wizzard erstelle und wähle ohne MFC Unterstützung wird in der stdafx.h folgendes eingefügt:

    #define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
    

    Erstelle ich eine DLL mit MFC wird der selbe definde eingefügt aber zusätlich noch

    #ifndef VC_EXTRALEAN
    #define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows headers
    #endif
    

    Beides mal der selbe Kommentar 😕

    Verwende ich nun in der DLL mit MFC die comutil.h (Variantuntertsützung) gibt es keinen Fehler.

    In der DLL ohne MFC erhalte ich die Fehlermeldung vom Compiler dass der typ VARIANT nicht bekannt ist. Hierzu muss ich dann #define WIN32_LEAN_AND_MEAN auskommentieren.

    Wieso? 😕


  • Mod

    Weil VARIANT dann nicht definiert ist bzw. nicht eingeschlossen wird...

    Ich verstehe Deine Frage nicht.

    Wenn Du wissen willst was passiert, dann such doch die defines. Du hast den Sourcecode. Es kostet Dich 5 Minuten, die Stellen anzuschauen, die betroffen sind...

    Weiterhin kostest es Dich 1 min. Google zu benutzen:

    https://msdn.microsoft.com/de-de/library/6dwk3a1z(v=vs.90).aspx?f=255&MSPPError=-2147217396
    https://stackoverflow.com/questions/11040133/what-does-defining-win32-lean-and-mean-exclude-exactly

    Bei den heutigen Rechnergeschwindigkeiten und Precompiled Headern sehe ich hier keine Vorteile.



  • Wenn ich eine neue DLL anlege in der ich kein MFC verwende
    dazu comutil.h einbinde und nen datentyp _variant_t anlege
    und #define WIN32_LEAN_AND_MEAN nicht auskommentieren kompiliert das Projekt.

    In meinem "richtigen" Projekt unter selben Vorraussetzungen erhalte ich einen Kompilierungsfehler wenn ich #define WIN32_LEAN_AND_MEAN nicht auskommentiere.

    Anders rum würde ich es ja verstehen. Aber das ist ja ein define der bestimmte includes ausschliesst.


  • Mod

    Dann includest Du zu viel.
    Zudem, warum schreibst Du nicht was für Fehler Du hast.
    Wenn Du die MFC nutzt ist comutil.h eingeschlossen.



  • Ich habe eine DLL erstellt in der ich MFC verwendet hatte. Aus verschiedenen Gründen musste ich die MFC Funktionalität aus meiner DLL entfernen.

    Seit ich nun die MFC entfernt habe erhalte ich Fehler bezüglich comutil.h

    Ich habe allerdings eine andere DLL ebenfalls ohne MFC wo ich auch comutil.h verwende dort erhalte ich keine Fehler

    insgesamt sind es 375 Fehler. Wobei die meisten Folgefehler sind

    hier mal etwas zusammengefasst:

    Error C2446 '==': no conversion from 'const VARIANT *' to 'const _variant_t *const ' comutil.h 2150
    Error C2664 'HRESULT VariantClear(VARIANTARG *)': cannot convert argument 1 from '_variant_t *const ' to 'VARIANTARG *' comutil.h 2266
    Error C2664 'HRESULT VariantCopy(VARIANTARG *,const VARIANTARG *)': cannot convert argument 1 from '_variant_t *const ' to 'VARIANTARG *' comutil.h 1138
    Error C2660 'memcmp': function does not take 2 arguments comutil.h 2182
    Error C2440 'static_cast': cannot convert from 'const _variant_t *' to 'const VARIANT *' comutil.h 1159
    Error C2371 'VARIANT': redefinition; different basic types oaidl.h 424
    Error C2660 'VariantChangeType': function does not take 3 arguments comutil.h 2317


  • Mod

    Du darfst nicht comutil.h includen sondern comdef.h ist der Header für die entsprechenden COM Konstrukte.



  • Gut
    Ich nutze den Resharper der hat mit automatsich comutil.h includiert. Woher soll man das auch wissen.

    Aber auch wenn ich nun comdef.h includiere erhalte ich die selben Fehler.


  • Mod

    ... das stand mal in der VC6 Doku. In der aktuellen Doku steht es nicht mehr...

    Welche header includest Du in welcher Folge. Da passt was nicht....



  • eigentlich includiere ich nur comutil.h bzw jetzt comdef.h von com

    std Klassen: wie string und vector

    dazu noch ein header file von Siemens WinCC

    #include "dmclient.h"
    -----------------------
    darin ist unter anderem folgendes definiert:

    #ifndef __DMCLIENT_H__
    #define __DMCLIENT_H__

    #ifndef _WINDOWS_
    #include <WINDOWS.H>
    #endif

    #ifndef OHIOAPI_H
    #include "OHIOAPI.H"
    #endif

    #ifndef __DMDEFS_H__
    #include "DMDEFS.H"
    #endif

    #ifndef __LICENSE_H__
    #include "LICENSE.H"
    #endif

    #ifdef _MSC_VER
    #pragma pack (push, DMCLIENT_Packing_Alignment)
    #endif

    #pragma pack (1)

    mehr includiere ich eigentlich nicht in meinem Programm.


  • Mod

    Mach zuerst den windows.h include! For allen anderen.


Anmelden zum Antworten