Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Mehrfaches Includen von Windows.h bei MFC

Yves3 / 9 Antworten / Baumansicht Nickles

Hallo

Ich verwende in meinem Projekt MFC. Das Includen von Windows.h vor dem Includen der MFC-Header erzeugt eine Fehlermeldung.
Leider verwende ich ein API, das die Windows.h includen muss und vor dem Include noch FD_SETSIZE (die Anzahl verwendeter Sockets) definiert.
Das ist also eine ziemlich hässliche Zwickmühle. :(

Hier die Meldung vom API:
"

bei Antwort benachrichtigen
PaoloP Yves3 „Mehrfaches Includen von Windows.h bei MFC“
Optionen

Ich hatte das Problem quasi identisch auch schon. Bei mir was es nur BerkeleyDB und nicht Pegasus.
Und bei mir half dann tatsächlich nur das Macro der 2. Library abzuändern.

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Yves3 PaoloP „Ich hatte das Problem quasi identisch auch schon. Bei mir was es nur BerkeleyDB...“
Optionen

So habe ich es jetzt gemacht.
Zufrieden bin ich mit der Lösung noch nicht ganz, aber immerhin funktioniert es.

Danke für deinen Kommentar!

bei Antwort benachrichtigen
d-oli Yves3 „So habe ich es jetzt gemacht. Zufrieden bin ich mit der Lösung noch nicht ganz,...“
Optionen

Ich werde nicht ganz schlau aus der Beschreibung des Problems. Aber könnte es sein, dass ein #ifdef FD_SETSIZE #undef FD_SETSIZE #endif vor dem includen helfen könnte? Und wie wird den FD_SETSIZE definiert mit #define oder mit #ifndef FD_SETSIZE #define FD_SETSIZE 256 #endif ...? Nur so wegen der Reihenfolge ...

d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
PaoloP d-oli „Ich werde nicht ganz schlau aus der Beschreibung des Problems. Aber könnte es...“
Optionen

na ein #ifdef hilft insofern auch nicht weiter weil der Präprozessor dann Bibliothek B mit Macro aus Bibliothek A versorgen will was beim kompilieren zu den wildesten und unsinnigsten Fehlermeldungen führt oft(bei mir hört er immer nach 103 Fehlern auf).
Namespaces greifen beim Präproz. ja nun leider nocht nicht. Das auslagern der Nicht-MFC Bibliothek in irgendeine externe DLL oder eine Lib kann helfen aber wenn man mal eben beides gleichzeitig verwenden will hat man ein Problem.

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
d-oli PaoloP „na ein ifdef hilft insofern auch nicht weiter weil der Präprozessor dann...“
Optionen

Okay ...?

Was mich verwundert ist die Meldung "This file must be included prior to any header file that defines FD_SETSIZE, such as <windows.h>, <winsock.h>, or <winsock2.h>". Das sieht ganz danach aus:

#if defined FD_SETSIZE
#error "This file must be included prior to any header file that defines FD_SETSIZE, such as <windows.h>, ... "
#endif


Wie wird denn nun FD_SETSIZE in den Headern definiert?

/*
 * Select uses arrays of SOCKETs. These macros manipulate such
 * arrays. FD_SETSIZE may be defined by the user before including
 * this file, but the default here should be >= 64.
 *
 * CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
 * INCLUDED IN WINSOCK2.H EXACTLY AS SHOWN HERE.
 */
#ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif /* FD_SETSIZE */

Quelle: http://doc.ddart.net/msdn/header/include/winsock2.h.html

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
Yves3 d-oli „Okay ...? Was mich verwundert ist die Meldung This file must be included prior...“
Optionen

//------------------------------------------------------------------------------
//
// PEGASUS_OS_TYPE_WINDOWS network system header files
//
//------------------------------------------------------------------------------

#ifdef PEGASUS_OS_TYPE_WINDOWS

# ifdef FD_SETSIZE
# ifndef PEGASUS_WMIMAPPER
# error ">Pegasus/Common/Network.h<: FD_SETSIZE is already defined. \
This file must be included prior to any header file that defines \
FD_SETSIZE, such as >windows.h<, >winsock.h<, or >winsock2.h<."
# else
# undef FD_SETSIZE
# endif
# endif
# define FD_SETSIZE 1024

# include >windows.h<
# ifndef _WINSOCKAPI_
# include >winsock2.h<
# endif
# include >wincrypt.h<
# ifdef PEGASUS_ENABLE_IPV6
# include >ws2tcpip.h<
# endif
#endif

bei Antwort benachrichtigen
d-oli Yves3 „//------------------------------------------------------------------------------...“
Optionen

Ich mach das mal lesbar ... ;-)

#ifdef PEGASUS_OS_TYPE_WINDOWS
   #ifdef FD_SETSIZE
      #ifndef PEGASUS_WMIMAPPER
         #error ">Pegasus/Common/Network.h                  This file must be included prior to any header file that defines \
                 FD_SETSIZE, such as >windows.hwinsock.hwinsock2.h       #else
         #undef FD_SETSIZE
      #endif
   #endif

   #define FD_SETSIZE 1024

   #include >windows.h    
   #ifndef _WINSOCKAPI_
       #include >winsock2.h    #endif

   #include >wincrypt.h
   #ifdef PEGASUS_ENABLE_IPV6
      #include >ws2tcpip.h    #endif
#endif

Hmmmm ... Da hat jemand auch schon an #undef gedacht.

Für mich sieht das so aus: entweder wird PEGASUS_WMIMAPPER vor dem Inkludieren dieses Headers definiert oder du inkludierst diesen Header vor .

Woher soll denn dieses PEGASUS_WMIMAPPER kommen? Steht da was im Manual zu dieser Bibliothek? Mapper >>> etwas zu etwas passendem zuordnen ... fehlt da was? Compileroptionen oder dergleichen?

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
Yves3 d-oli „Ich mach das mal lesbar ... - ifdef PEGASUS_OS_TYPE_WINDOWS ifdef FD_SETSIZE...“
Optionen
WMI Mapper

The WBEM to WMI Mapper provides a way to access WMI data from Windows platform systems. It converts incoming XML/CIM requests to Microsoft WMI requests, executes the requests, converts the results to XML/CIM and returns the results to the client. WMI Mapper receives an HTTP message containing the XML/CIM request. It decodes the XML message and extracts from the HTTP message header the user credentials provided on the connection (username and password). The WMI Mapper authenticates these credentials, verifying if the provided credentials have access to the desired WMI data. This is done because the WMI Mapper runs as a service, logged on using an account with administrative rights (which has all access to WMI data). Because of this, the WMI Mapper impersonates the user credentials provided on the HTTP message to ensure that the calling user has rights to browse WMI data. Hence, ALL requests made to the WMI Mapper MUST contain user credentials.

Ich brauche das nicht, verwende nur standard XML/CIM.
Mit dem Manual ist das so ne Sache... das kann man sich fröhlich im ganzen Netz, aus Kommentaren im Sourcecode und einigen Dateien in einem Doc Verzeichnis zusammensuchen.

Ich habe folgendes gefunden: http://www.openpegasus.org/pp/upreviews/40/324/PEP078_Authentication_Changes.htm

Zitat daraus.
... In order to enable the authentication, the user must set the define PEGASUS_WMIMAPPER on the Makefile while building the Mapper code. As this file is under the WMI Mapper specific source tree, this define is set by default.

Aber wie gesagt, ich brauche den WMI Mapper nicht.
bei Antwort benachrichtigen
d-oli Yves3 „ Ich brauche das nicht, verwende nur standard XML/CIM. Mit dem Manual ist das so...“
Optionen

Dann sieht es doch so aus: entweder du verwendest den WMI Mapper oder der fehlerproduzierende Header muss vor windows.h inkludiert werden. Die SW ist ev.nicht dafür ausgelegt wofür du sie verwenden willst. Desshalb bleibt dir wohl tatsächlich nichts anderes übrig, als den Header auf deine Bedürfnisse anzupassen. Was soll daran schlecht sein? Das ist überigens ein Vorzug von OSS - du nimmst was du brauchen kannst, passt es auf deine Bedürfnisse an etc. etc.

d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen