AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SHBrowseForFolder öffnet Dateien?
Thema durchsuchen
Ansicht
Themen-Optionen

SHBrowseForFolder öffnet Dateien?

Ein Thema von himitsu · begonnen am 30. Nov 2006 · letzter Beitrag vom 4. Dez 2006
 
Benutzerbild von himitsu
himitsu
Online

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

SHBrowseForFolder öffnet Dateien?

  Alt 30. Nov 2006, 14: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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz