FileOpen-Dialog -> OFN_NODEREFERENCELINKS funktioniert nicht!



  • Shlo schrieb:

    Das blöde daran ist, dass bitweises AND ein höhere Priorität hat als bitweises OR 😃 🙂

    Also dann so: ?!

    ofn.Flags = (OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST) & ~OFN_NODEREFERENCELINKS;
    


  • Genau 🤡



  • ofn.Flags = (OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST) & ~OFN_NODEREFERENCELINKS;
    

    Ändert leider auch nichts. Ich habe übrigens XP.



  • Hmm...

    Also bei mir funzt es...

    Löschst Du evtl. die OPENFILENAME-Struktur nicht vor Benutzung?

    Also:

    OPENFILENAME ofn = {NULL};
    

    oder:

    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    

    😕



  • Ich denke, es ist am besten, wenn ich euch meine ganze Funktion zeige:

    TCHAR* DiaOpen()
    {
    TCHAR* buffer = new TCHAR[300];
    TCHAR paraBuf[20];
    ZeroMemory(buffer, 300);
    ZeroMemory(paraBuf, 20);
    
    OPENFILENAME ofn;
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hMain;
    ofn.hInstance = hInstance;
    lstrcpy(paraBuf, TEXT("All File Types"));
    ofn.lpstrFilter = paraBuf;
    ofn.lpstrCustomFilter = NULL;
    ofn.nMaxCustFilter = NULL;
    ofn.nFilterIndex = 14;
    lstrcpy(buffer,TEXT("*"));
    ofn.lpstrFile = buffer;
    ofn.nMaxFile = 300;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = NULL;
    ofn.lpstrInitialDir = NULL;
    ofn.lpstrTitle = TEXT("Open...");
    ofn.Flags = (OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST) & ~OFN_NODEREFERENCELINKS;
    ofn.nFileOffset = NULL;
    ofn.nFileExtension = NULL;
    ofn.lpstrDefExt = NULL;
    ofn.lCustData = NULL;
    ofn.lpfnHook = NULL;
    ofn.lpTemplateName = NULL;
    
    if( (!(GetOpenFileName(&ofn))) && (0==CommDlgExtendedError()))
    		lstrcpy(buffer,TEXT("CANCELLED")); 
    return buffer;
    }
    

    Die Funktion funktioniert wie gewollt. Nur besteht leider das Problem mit OFN_NODEREFERENCELINKS.



  • Funktioniert der Filter?

    In allen Beispielen, die ich kenne, wird der mit

    ofn.lpstrFilter = "Bild-Dateien (*.jpg;*.bmp;*.gif)\0*.jpg;*.bmp;*.gif\0Alle Dateien (*.*)\0*.*\0\0";
    

    belegt!

    Denn, in der MSDN steht auch:

    MSDN schrieb:

    Windows XP: In the case of a shortcut, if no filter is set, GetOpenFileName and GetSaveFileName retrieve the name of the .lnk file, not its target. This behavior is the same as setting the OFN_NODEREFERENCELINKS flag in the Flags member. To retrieve a shortcut's target without filtering, use the string "All Files\0*.*\0\0".



  • 1. Ja, mein Filter funktioniert.
    2. Das was du da geschriebn hast sieht gut aus und hilft nicht. Ich denke ich ahbe das ganze falsch umgesetzt, da ich von Anfang an einen String mit mehreren terminating-nulls in der mitte komisch fand.

    Du hast ja gesagt, bei dir gehe das. Kannst du bitte deinen Code (nur die eine Zeile genügt) posten?



  • OPENFILENAME  ofn;
    ZeroMemory(ofn, sizeof(OPENFILENAME));	
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hMain;
    ofn.lpstrFilter = TEXT("Alle Dateien (*.*)\0*.*\0\0");
    ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY;
    ofn.lpstrFile = buffer;
    ofn.nFilterIndex = 0; //Der ERSTE Filter soll zu Beginn aktiv sein!
    

    Da Du zwar einen Filter angibst, ihn aber nicht in ofn.nFilterIndex (warum packst Du da eigentlich 14 rein?!?) aktivierst, geht das Sytem davon aus, das es Deinen Filter als NULL interpretieren soll. Dann greift folgende Aussage aus der MSDN:

    MSDN schrieb:

    Windows XP: In the case of a shortcut, if no filter is set, GetOpenFileName and GetSaveFileName retrieve the name of the .lnk file, not its target. This behavior is the same as setting the OFN_NODEREFERENCELINKS flag in the Flags member. To retrieve a shortcut's target without filtering, use the string "All Files\0.*\0\0".*



  • (Ich hatte vorhin 14 weil ich damit experimentiert hatte / es hatte überhaupt keine Auswirkungen auf die Ausführung des Codes und mein Filter funktiionierte auch bei 14 ;))

    ofn.nFilterIndex = 0;
    

    tut es auch nicht. Am besten jmd. kopiert folgende Funktion 1:1 bei sich ein und probierts dann. Dann wird klar ob es an DIESER Funktion liegt oder nicht.

    //Funktion:
    TCHAR* DiaOpen()
    {
    TCHAR* buffer = new TCHAR[300];
    TCHAR paraBuf[20];
    ZeroMemory(buffer, 300);
    ZeroMemory(paraBuf, 20);
    
    OPENFILENAME ofn;
    ZeroMemory(&ofn, sizeof(OPENFILENAME)); 
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hMain;
    ofn.hInstance = hInstance;
    lstrcpy(paraBuf, TEXT("All Files\0*.*\0\0"));
    ofn.lpstrFilter = paraBuf;
    ofn.lpstrCustomFilter = NULL;
    ofn.nMaxCustFilter = NULL;
    ofn.nFilterIndex = 0;
    lstrcpy(buffer,TEXT("*"));
    ofn.lpstrFile = buffer;
    ofn.nMaxFile = 300;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = NULL;
    ofn.lpstrInitialDir = NULL;
    ofn.lpstrTitle = TEXT("Which file do you want to send?");
    ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST;
    ofn.nFileOffset = NULL;
    ofn.nFileExtension = NULL;
    ofn.lpstrDefExt = NULL;
    ofn.lCustData = NULL;
    ofn.lpfnHook = NULL;
    ofn.lpTemplateName = NULL;
    
    if( (!(GetOpenFileName(&ofn))) && (0==CommDlgExtendedError()))
    		lstrcpy(buffer,TEXT("CANCELLED")); 
    return buffer;
    }
    
    //hiermit könnt ihr die funktion testen.
    MessageBox(NULL, DiaOpen(), TEXT("Test"), NULL);
    

    Danke.



  • Natürlich liegt es an Deiner Funktion!

    Was meinst Du bis wohin diese Zeile

    lstrcpy(paraBuf, TEXT("All Files\0*.*\0\0"));
    

    den Text in paraBuf kopiert? Evtl. bis zur ersten '\0'?

    Und schon hast Du wieder einen ungültigen Filter und hast das von mir aus der MSDN kopierte Verhalten.

    ofn.lpstrFilter = TEXT("All Files\0*.*\0\0");
    


  • Also bei mir wird bei lnk-Files der Name der verlinkten Datei (z.B. notepad.exe) ausgegeben 😉
    Achso: hab gar kein XP, sondern W2K 🙄 🤡


Anmelden zum Antworten