FileOpen-Dialog -> OFN_NODEREFERENCELINKS funktioniert nicht!
-
Obwohl ich den OFN_NODEREFERENCELINKS-Style NICHT aktiviert habe liefert die DialogBox immer den Path der .lnk datei.
Dabei gilt laut MSDN:
Wenn OFN_NODEREFERENCELINKS aktiviert dann: Der Pfad der .lnk datei wird returned.
Wenn OFN_NODEREFERENCELINKS NICHT aktiviert dann: Der Pfad der Datei auf den der LInk zeigt.
Bei mir jecoh liefert die DialogBox in beiden Fällen den Pfad zur .lnk datei.
Hier alle Style die ich aktiviert habe:
ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST;Kennt jemand den richtigen Weg?
-
evtl. mal explizit löschen - vielleicht hilft das ja

ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST & ~OFN_NODEREFERENCELINKS;
-
War ne sehr gute Idee, hat aber nicht geholfen.
-
flenders schrieb:
evtl. mal explizit löschen - vielleicht hilft das ja

ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST & ~OFN_NODEREFERENCELINKS;Das blöde daran ist, dass bitweises AND ein höhere Priorität hat als bitweises OR

-
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
