_WIN32_WINNT defines in library?



  • Hi!

    Mal angenommen, ich habe zwei Anwendungen, die sich eine static lib teilen. Ich nutze überall precompiled header und habe bis jetzt auch überall

    #define _WIN32_WINNT _WIN32_WINNT_WINXP
    #define NTDDI_VERSION NTDDI_WINXPSP3

    geschrieben, auch in der lib. Doch jetzt will ich in einer der beiden Anwendungen Funktionen nutzen, die erst ab Vista verfügbar sind.

    Wie gehe ich jetzt vor? Wenn ich die defines nur aus der Anwendung nehme, gibts ne Menge warnings "'_WIN32_WINNT' : macro redefinition" usw...

    Soll ich die defines also auch aus der lib nehmen? Kann ich dann in der lib auch Vista-Funktionen nutzen, und die XP-Anwendung bleibt trotzdem XP-kompatibel, auch wnen sie die lib nutzt?

    Danke!



  • Komisch, ich kann in der XP-only Anwendung auch Funktionen aufrufen, die erst ab Vista verfügbar sind, obwohl ich in den precompiled header die #defines (siehe oben) geschrieben habe!
    Das sollte nicht so sein 😞



  • Äh, da stimmt doch was nicht.

    Bei SetFileCompletionNotificationModes sagt die IDE "undefined", bei BCryptOpenAlgorithmProvider jedoch nicht, ich kann es also aufrufen! Dabei sind beide Funktionen erst ab Vista verfügbar!

    😕


  • Mod

    Warum setzt Du diese Dinge nicht nur in den internen Files/Headern für das Erzeugen der Libs.

    Es kann Dir doch egal sein, was extern benutzt wird. "Verändert" wird ja nichts durch diese Header. Die Funktionen bleiben die gleichen, es werden nur neue Strukturen und Funktionen verfügbar.

    Die Header der Lib, die Du dann verwendest sollten frei von so etwas sein... außer es gibt hier eine spezielle Bindung, dann würde ich das aber per #if prüfen.



  • Na aber ich möchte doch, dass nicht unabsichtlich Funktionen aufgerufen werden, die bei XP nicht verfügbar sind.


  • Mod

    Und? Wo ist das Problem?

    Dafür setzt Du die Defines in den Headern für die Library.
    Eben nicht in den öffentlichen Headern für die Lib, die der Lib-Nutzer benötigt.

    Es sollte doch dem Lib-Nutzer freistehen, was er benutzen will.



  • Ich benutze aber precompiled header. Und die sind überall vorhanden... Außerdem ist die lib nur für mich.

    Ein weiteres Problem ist außerdem:

    mecha. schrieb:

    Äh, da stimmt doch was nicht.

    Bei SetFileCompletionNotificationModes sagt die IDE "undefined", bei BCryptOpenAlgorithmProvider jedoch nicht, ich kann es also aufrufen! Dabei sind beide Funktionen erst ab Vista verfügbar!

    😕


  • Mod

    1. Selbst wenn Du precompiled Header benutzt, dann setz das eben in die stdafx.h der lib rein.

    Warum willst Du es sonst noch irgendwo haben?
    Ich verstehe den Einwurf nicht.

    2. Für SetFileCompletionNotificationModes gilt
    #if (_WIN32_WINNT >= 0x0600)

    3. Da bcrypt.h erst mit Windows 2008 eingeführt wurde bist Du selbst verantwortlich es nicht zu benutzen!
    Entsprechend gibt es in der Header Datei keine versionsspezifischen ifdefs.



  • Martin Richter schrieb:

    1. Selbst wenn Du precompiled Header benutzt, dann setz das eben in die stdafx.h der lib rein.

    Ja, doch die wird von allen anderen Headern included, und landet somit in meinen Applikationen.

    Martin Richter schrieb:

    Warum willst Du es sonst noch irgendwo haben?
    Ich verstehe den Einwurf nicht.

    Ich wollte einfach sicherstellen, dass in Anwendung 1 keine Funktionen aufgerufen werden, die in XP nicht verfügbar sind, während Anwendung 2 auf XP nicht laufen muss und somit Vista+ Funktionen nutzen kann.

    Martin Richter schrieb:

    3. Da bcrypt.h erst mit Windows 2008 eingeführt wurde bist Du selbst verantwortlich es nicht zu benutzen!
    Entsprechend gibt es in der Header Datei keine versionsspezifischen ifdefs.

    Ohh.. okay, ich denke dann lasse ich die defines komplett weg und achte eben genau darauf, welche Funktionen ich verwenden.


  • Mod

    Dann Share nicht die stdafx.h

    Also noch mal detailiert:
    Verwende für jedes Projekt, d.h. auch für die Library eigene Header Dateien.
    Wenn die Lib für XP kompiliert wird, dann kannst Du die in jedem anderen Projekt verwenden.

    D.h. Du kannst auch ein neues Projekt anfangen und das für Vista definiern und dennoch die selbe Lib verwenden.



  • Martin Richter schrieb:

    Dann Share nicht die stdafx.h

    Tue ich ja nicht, aber ich dachte dass die std.afx, welche im Header einer Lib steht, dann auch mit in dem Projekt landet (inkl. defines), welches nur den Header inkludiert.


Log in to reply