IFileDialog und SHBrowseForFolder parallel nutzen



  • Hallo zusammen,

    ich habe ein kleines Problemchen, das ich auch nach längerer Recherche jetzt nicht gelöst kriege.

    Aus Kompatibilitätsgründen muss mein Programm für XP kompiliert werden. Ich verwende also für alle Windows Versionen XP und älter die Methode 'SHBrowseForFolder' zum Auswählen eines Ordners.

    Da liegt auch noch nicht das Problem, da diese Funktion ja sowieso für alle Versionen funktioniert.

    Für Vista und neuer würde ich gerne aber den neuen IFileDialog benutzen, weil schöner, perfomanter, etc. pp.

    IFileDialog *pfd = NULL;
    HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
    

    Gibt folgenden Error:

    OpenFolder.cpp(2241) : error C2787: 'IFileDialog': Keine GUID mit diesem Objekt verbunden
    

    Könnt ihr mir sagen, wie ich das gelöst kriege?
    Kann man das irgendwie dynamisch dazulinken?
    Am besten mit Codeschnipsel, wenn möglich 👍

    http://stackoverflow.com/questions/5346451/how-do-i-use-ifiledialog-in-a-vc-2010-project-converted-from-vc-6-0

    Darauf bin ich schon gestoßen, ich habe aber leider wie gesagt nicht die Möglichkeit, was am Compiler zu verändern.

    Danke im Voraus 🙂



  • IID_PPV_ARGS fügt zwei Parameter ein: den ID des interfaces, und das interface.

    Wahrscheinlich würde

    IFileDialog *pfd = NULL;
    HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_IFileDialog, &pfd);
    

    es erstmal lösen.

    Der ID des interfaces wird über __uuidof() abgeleitet, wahrscheinlich fehtl Dir das #include, das IFileDialog mit seinem IID assoziiert.

    siehe auch:
    https://msdn.microsoft.com/en-us/library/3b6wkewa.aspx
    https://msdn.microsoft.com/en-us/library/windows/desktop/ff485839(v=vs.85).aspx

    P.S. hab ne weile gegrübelt, was der Fehler mit dem Code zu tun haben soll - bis mir klar wurde daß es ein Compiler-Fehler ist 🙂


  • Mod

    Wenn Du Teile von Windows kompilieren willst die neuer als XP sind must Du auch die entsprechende WINVER Version setzen.

    Und wenn Du das eben nur für dieses Modul machst...

    PS: Parallel unterwegs in Stackoverflow? 😉



  • peterchen schrieb:

    IID_PPV_ARGS fügt zwei Parameter ein: den ID des interfaces, und das interface.

    Wahrscheinlich würde

    IFileDialog *pfd = NULL;
    HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_IFileDialog, &pfd);
    

    es erstmal lösen.

    Der ID des interfaces wird über __uuidof() abgeleitet, wahrscheinlich fehtl Dir das #include, das IFileDialog mit seinem IID assoziiert.

    siehe auch:
    https://msdn.microsoft.com/en-us/library/3b6wkewa.aspx
    https://msdn.microsoft.com/en-us/library/windows/desktop/ff485839(v=vs.85).aspx

    P.S. hab ne weile gegrübelt, was der Fehler mit dem Code zu tun haben soll - bis mir klar wurde daß es ein Compiler-Fehler ist 🙂

    Danke erstmal für die Antwort 🙂
    Dein Code gibt mir einen neuen Error 😃

    ..\OpenFolder.cpp(2233) : error C2065: 'IID_IFileDialog': nichtdeklarierter Bezeichner
    

    Welches include meinst du?



  • Martin Richter schrieb:

    Wenn Du Teile von Windows kompilieren willst die neuer als XP sind must Du auch die entsprechende WINVER Version setzen.

    Und wenn Du das eben nur für dieses Modul machst...

    PS: Parallel unterwegs in Stackoverflow? 😉

    Ja, parallel auf Stackoverflow unterwegs 😃
    Wenn ich WINVER ändere, dann klappt es, danke 🙂

    Abwärtskompatibel ist das ja alles, oder?
    Also wenn ich für einen XP Rechner dann SHBrowseForFolder nehme, dann geht das weiterhin schätze ich.



  • habit187 schrieb:

    Abwärtskompatibel ist das ja alles, oder?

    In diesem Fall ja, das CoCreateInstance wirft einen Fehler zur Laufzeit (i.d.R. REGDB_E_CLASSNOTREG)

    An WinVer hatte ich gar nicht mehr gedacht 🙂



  • Wenn ich jetzt die WINVER bloß für dieses eine CPP File ändern will, wo setze ich da an?

    Würde gerne bloß vor Kompilieren des OpenFolder.cpp die WINVER auf Vista setzen, direkt danach wieder zurück.
    Geht das?



  • Du willst quasi für den Rest des Projekts die API-Version auf XP-kompatibel lassen?

    In neueren von Visual Studio erstellten Projekte ist WINVER in "targetver.h" konfiguriert (wird von stdafx.h reingeladen).
    In den VC6-Projekten stand's, glaub ich, in der stdafx.h

    Normalerweise bringt es nix, WINVER nur in einem File anders zu konfigurieren. In Deinem Fall schon; dazü müßtest du:

    Vorkompilierte Header für diese .cpp deaktivieren (bzw. nicht aus stdafx.cpp generieren), und stdafx.h nicht reinladen.

    Vor dem Reinladen von windows.h dann WINVER entsprechend definieren.

    Natürlich dürfen die neueren Definitionen dann auch nur in dieser .cpp verwendet werden, nicht z.B. in einem Header.


  • Mod

    Ich mache das folgendermaßen.

    Ich Platziere die entsprechenden Dateien in zwei "Ordnern" im VS.
    Dann bekommt jede der Dateigruppen eine eigene Pre Compiled Header Datei inkl. entsprechender Settings.


Log in to reply