Moin ihr,
ich hab da ein kleines Problem mit SHBrowseForFolder (wer hätt's gedacht -.-'').
Und zwar scheint dieses Dateien/Verzeichnisse zu öffnen (per CreateFile, oder so) und nicht wieder zu schließen.
Anfangs dachte ich schon der Fehler liegt in meinem Programm und hab mich halt totgesucht.
Die Auswirkung ist, daß die Dateien/Verzeichnisse z.B. nicht mehr gelöscht werden können.
Dat is sozusagen mein Code:
Delphi-Quellcode:
Type TFolderRec = Record
PreSelectedFolder, Title: PWideChar;
End;
PFolderRec = ^TFolderRec;
Function FolderCallback(Dlg: HWND; Msg: LongWord; LParam: Pointer; Data: PFolderRec): LongWord; StdCall;
Var Temp: TFileNameW;
Begin
Case Msg of
BFFM_INITIALIZED: Begin
SendMessage(Dlg, WM_SETTEXT, 0, Integer(PChar(ProgName)));
If Data^.PreSelectedFolder <> nil Then
SendMessageW(Dlg, BFFM_SETSELECTIONW, LongInt(True), Integer(Data^.PreSelectedFolder));
End;
BFFM_VALIDATEFAILED: Begin
Result := 1;
Exit;
End;
End;
Result := 0;
End;
Function BrowseForFolder(Wnd: HWND; Const Caption, PreSelectedFolder: WideString; Var SelectedDir: WideString): Boolean;
Var BI: TBrowseInfoW;
FolderRec: TFolderRec;
pidlResult: PItemIDList;
Temp: TFileNameW;
Malloc: iMalloc;
Begin
Result := False;
ZeroMemory(@BI, SizeOf(BrowseInfoW));
BI.hwndOwner := Wnd;
BI.lpszTitle := PWideChar(Caption);
BI.ulFlags := BIF_NEWDIALOGSTYLE or BIF_SHAREABLE;
BI.lpfn := @FolderCallBack;
BI.lParam := Integer(@FolderRec);
FolderRec.Title := PWideChar(Integer(Caption));
FolderRec.PreSelectedFolder := PWideChar(Integer(PreSelectedFolder));
pidlResult := SHBrowseForFolderW(BI);
If pidlResult = nil Then Exit;
If SHGetPathFromIdListW(pidlResult, @Temp[0]) Then Begin
Result := True;
SelectedDir := Temp;
End;
If SHGetMalloc(Malloc) = S_OK Then
Try
Malloc.Free(pidlResult);
Finally
Malloc := nil;
End;
End;
Und in der angehängten EXE werden zum Test die offenen FileHandles gezählt.
Die aktuelle Anzahl steht im Hauptfenster, unterm "Source"-Label.
Mein BrowseForFolder ist im Anhang auf'm [Start]-Dialog (der Pfeil-Button neben den Edits) erreichbar ... sobald er erscheint tauchen plötzlich 3-4 FileHandles auf und die verschwinden erst wieder, wenn das Programm beendet wird.
Die Handles entstehen auch direkt in SHBrowseForFolder. (davor 0 und danach meist 3)
An der FolderCallback kann es auch nicht liegen, denn wenn diese fehlt, das selbe Ergebnis.
Am BIF_SHAREABLE liegt es auch nicht. (der Zugriffstest lag ja nahe)
Ach ja, rein theoretisch könnte ich die offenen FileHandles auslesen, SHBrowseForFolder aufrufen und dann alle zusätzlichen FileHandles schließen,
aber ich denk dieses wäre nicht ganz optimal, vorallem da nicht klar ist was dann passieren könnte.
Hab die FileHandle zwar schon einige male über'n Process Explorer abgeschossen ... ohne Probleme, allerdings würde ich sowas derzeit nich auf fremden Rechnern versuchen wollen. :engel:
System: WinXP SP2