Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.287 Beiträge
 
Delphi 12 Athens
 
#1

SHBrowseForFolder öffnet Dateien?

  Alt 30. Nov 2006, 15:03
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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat