none
WINVER Auswertung, AddToRecentFileList

    Frage

  • Hallo NG,

    wir haben mehrere Anwendungen auf VS2010 unter Nutzung von MFCNext Klassen umgestellt (Statische MFC Einbindung).
    Bei der Validierung ist folgendes Problem unter Windows7 aufgetreten.

    Beim Öffnen oder Schließen einer Datei innerhalb unserer Anwendungen wird diese Funktion

    void CWinApp::AddToRecentFileList(LPCTSTR lpszPathName)
    {
    ASSERT_VALID(this);
    ENSURE_ARG(lpszPathName != NULL);
    ASSERT(AfxIsValidString(lpszPathName));

    if (m_pRecentFileList != NULL)
    {
    #if (WINVER >= 0x0601)
    m_pRecentFileList->Add(lpszPathName, m_pszAppID);
    #else
    m_pRecentFileList->Add(lpszPathName);
    #endif
    }
    }

    aufgerufen. Unserer Applikation setzt WINVER auf 0x0501.
    Wenn allerdings die obige Funktion durchlaufen wird kann man erkennen dass immer der Zweig (WINVER >= 0x0601) durchlaufen wird.

    Auf einem XP System gibt es keine Probleme, auf einem Windows7 kommt dir Fehlermeldung "... ungültiges Argument".
    Ich muss zugegeben in dem speziellen Fall existiert die Datei die in die RecentFile List eingetragen werden soll noch nicht.

    Debuggt man in m_pRecentFileList->Add(lpszPathName, m_pszAppID); kann man ein Unterschiedliches Handling für Windows7 erkennen.

    Meine Hauptfrage ist, warum lande ich überhaupt in dem Zweig #if (WINVER >= 0x0601) wenn doch WINVER in meinem stdafx.h auf 0x0501 gesetzt wird.
    Überlade ich die Funktion "AddToRecentFileList" in meiner App-Klasse mit exakt dem gleichen Code funktionert alles wie erwartet. Ich lande im #else Zweig.

    Kann ich hier in noch mehr Probleme (bzgl. WINVER) laufen. Unsere Apps sollen weiterhin auf XP laufen können.

    Gruß
    Markus

    Mittwoch, 1. Dezember 2010 05:46

Antworten

  • Das Problem ist, dass Windows 7 erwartet, dass eine Datei existiert, die in die File-Liste für die Shell aufgenommen wird.
    Wie aber der OP schon schrieb: Die Datei existierte eben noch nicht...

    Das Problem liegt nicht in der MFC sondern in der Anwendnung der Funktion.

    Und korrekt: Die MFC wird für Windows 7 übersetzt, hat aber wie man sehen kann irrsinnig viele dynamische Parts drin, die alle möglichen OS Konstellationen und unterschiedliche APIs berücksichtigen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 1. Dezember 2010 08:20
    Moderator
  • Hallo Jochen,

    scheint mir auch so. Die Auswertung läuft zur Laufzeit wohl über solche Abfragen.

    if (!afxGlobalData.bIsWindows7)

    Bzgl. meiner Fehlermeldung unter Win7, habe jetzt in dem Fall wo die Datei noch nicht existiert, vermieden den Dateinamen in die MRU aufnehmen zu lassen.
    Damit hat sich mein Problem erledigt.

    Ansonsten hat es hier die Fehlermeldung innerhalb von

    void CRecentFileList::Add(LPCTSTR lpszPathName, LPCTSTR lpszAppID)

    bei diesem Aufruf gegeben:

    hr = afxGlobalData.ShellCreateItemFromParsingName(lpWPath, NULL, IID_IShellItem, (LPVOID*)&psi);
    Macht ja Sinn wenn es die Datei auch noch nicht gibt.
    Mittwoch, 1. Dezember 2010 06:56

Alle Antworten

  • Das sieht für mich ein bisschen seltsam aus... da das WINVER ja nur beim Compilieren der MFC ausgewertet wird!
    Und diese wurde vermutlich mit Win7 (601) übersetzt. Somit würde ich dies als Bug der MFC betrachten, da diese Auswertung ja zur Laufzeit erfolgen muss...

    Aber vermutlich kennt sich das Martin besser aus ;)


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 1. Dezember 2010 06:41
  • Hallo Jochen,

    scheint mir auch so. Die Auswertung läuft zur Laufzeit wohl über solche Abfragen.

    if (!afxGlobalData.bIsWindows7)

    Bzgl. meiner Fehlermeldung unter Win7, habe jetzt in dem Fall wo die Datei noch nicht existiert, vermieden den Dateinamen in die MRU aufnehmen zu lassen.
    Damit hat sich mein Problem erledigt.

    Ansonsten hat es hier die Fehlermeldung innerhalb von

    void CRecentFileList::Add(LPCTSTR lpszPathName, LPCTSTR lpszAppID)

    bei diesem Aufruf gegeben:

    hr = afxGlobalData.ShellCreateItemFromParsingName(lpWPath, NULL, IID_IShellItem, (LPVOID*)&psi);
    Macht ja Sinn wenn es die Datei auch noch nicht gibt.
    Mittwoch, 1. Dezember 2010 06:56
  • Ich hab mir das nochmals genauer angeschaut. Das Add(lpszPathName, m_pszAppId) prüft doch intern ob es WIn7 ist:

    void CRecentFileList::Add(LPCTSTR lpszPathName, LPCTSTR lpszAppID)
    {
        if (!afxGlobalData.bIsWindows7)
        {
     Add(lpszPathName);
     return;
        }
    // ...

    Somit verstehe ich Deine Frage bzw. Dein Problem nicht ganz....


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 1. Dezember 2010 06:58
  • Also, dann passt ja alles... macht ja auch nicht wirklich Sinn eine Datei in die MRU Liste aufzunehmen die es nicht gibt...


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 1. Dezember 2010 06:59
  • Das Problem ist, dass Windows 7 erwartet, dass eine Datei existiert, die in die File-Liste für die Shell aufgenommen wird.
    Wie aber der OP schon schrieb: Die Datei existierte eben noch nicht...

    Das Problem liegt nicht in der MFC sondern in der Anwendnung der Funktion.

    Und korrekt: Die MFC wird für Windows 7 übersetzt, hat aber wie man sehen kann irrsinnig viele dynamische Parts drin, die alle möglichen OS Konstellationen und unterschiedliche APIs berücksichtigen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 1. Dezember 2010 08:20
    Moderator