Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Do 02.10.03 18:29 
Hi,

ich verwende folgenden Code, um zu prüfen, ob der Papierkorb leer ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function RecycleBinIsEmpty: Boolean;
// siehe http://www.swissdelphicenter.ch/de/showcode.php?id=1009
// prüft, ob der Papierkorb leer ist.
const
  CLSID_IRecycleBin: TGUID = (D1: $645FF040; D2: $5081; D3: $101B;
    D4: ($9F$08$00$AA$00$2F$95$4E));
var
  EnumIDList: IEnumIDList;
  FileItemIDList: PItemIDList;
  ItemCount: ULONG;
  RecycleBin: IShellFolder;
begin
  CoInitialize(nil);
  OleCheck(CoCreateInstance(CLSID_IRecycleBin, nil, CLSCTX_INPROC_SERVER or
    CLSCTX_LOCAL_SERVER, IID_IShellFolder, RecycleBin));
  RecycleBin.EnumObjects(0,
    SHCONTF_FOLDERS or
    SHCONTF_NONFOLDERS or
    SHCONTF_INCLUDEHIDDEN,
    EnumIDList);
  Result := EnumIDList.Next(1, FileItemIDList, ItemCount) <> NOERROR;
  CoUninitialize;
end;


Scheinbar funktioniert dieser allerdings nicht unter Windows XP. Leider kann ich das nicht selber testen, weil ich XP nicht habe.

Könnt Ihr mir sagen, wie ich diesen Code ändern muss, dass er auch unter XP funktioniert.

Danke

lg
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.10.03 20:39 
Ich benutze SHQueryRecycleBin, da gibt´s ein Record bzw. eine Membervariable in selbigem, die > Null ist, wenn sich Elemente im Papierkorb befinden. Und dann kann ich ihn auch leeren, wenn ich mag. :)
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Do 02.10.03 21:10 
Kannst Du einem ewigen Anfänger bitte, bitte etwas Code dazu liefern, wie Du das machst.

Danke!

_________________
(Sorry! Leider ewiger Delphi-Neuling)
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: Do 02.10.03 21:35 
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.10.03 21:36 
Falls dein Delphi die Funktion noch nicht kennt, dann bitte hier schauen. In diesem Beitrag habe ich die notwendigen Deklarationen schon mal aufgeschrieben. Bei Delphi 5 ist es notwendig, bei Delphi 7 evtl. nicht mehr (die Unit ShellAPI mal ausprobieren!).

Um die Funktion nutzen zu können, brauchst du eine Variable vom Typ "TSHQueryRBInfo". Das ist das o.g. Record, das ich auch in meiner ersten Antwort ansprach:
ausblenden Delphi-Quelltext
1:
2:
var
  RBInfo : TSHQueryRBInfo;

Und dann geht´s los:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Record leeren
ZeroMemory(@RBInfo,sizeof(TSHQueryRBInfo));

// Größe setzen
RBInfo.cbSize := sizeof(TSHQueryRBInfo);

// Funktion aufrufen
if(SHQueryRecycleBin('',RBInfo) = S_OK) then
  // is´ was im Papierkorb drin?
  if(RBInfo.i64NumItems > 0then
    // dann löschen ...

Fertig. :)

Bitte auch die Infos im PSDK beachten:
PSDK hat folgendes geschrieben:
Remarks

With Microsoft® Windows® 2000, if NULL is passed in the pszRootPath parameter, the function fails and returns an E_INVALIDARG error code. Earlier versions of the operating system allow you to pass an empty string or NULL. If pszRootPath contains an empty string or NULL, information is retrieved for all Recycle Bins on all drives.
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Do 02.10.03 22:29 
Danke für Deine Hilfe.

Trotzdem schaff ich es leider noch nicht ein vernünftiges Ergebnis zu bekommen. :cry:

Irgendwas stimmt an meinem Code nicht:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
unit PapTestUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls ;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    Label2: TLabel;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  type 
  {$EXTERNALSYM _SHQUERYRBINFO} 
  _SHQUERYRBINFO = 
    packed record 
      cbSize  : DWORD; 
      i64Size : int64;
      i64NumItems : int64;
    end
  {$EXTERNALSYM TSHQueryRBInfo} 
  TSHQueryRBInfo = _SHQUERYRBINFO; 
  {$EXTERNALSYM PSHQueryRBInfo}
  PSHQueryRBInfo = ^TSHQueryRBInfo;

const 
  {$EXTERNALSYM SHERB_NOCONFIRMATION} 
  SHERB_NOCONFIRMATION    = $00000001
  {$EXTERNALSYM SHERB_NOPROGRESSUI} 
  SHERB_NOPROGRESSUI      = $00000002
  {$EXTERNALSYM SHERB_NOSOUND} 
  SHERB_NOSOUND           = $00000004

  {$EXTERNALSYM SHQueryRecycleBinA} 
  function SHQueryRecycleBinA(pszRootPath: LPCTSTR; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall;
  {$EXTERNALSYM SHQueryRecycleBinW} 
  function SHQueryRecycleBinW(pszRootPath: LPWSTR; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall
  {$EXTERNALSYM SHQueryRecycleBin} 
  function SHQueryRecycleBin(pszRootPath: LPCTSTR; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall
  {$EXTERNALSYM SHEmptyRecycleBinA} 
  function SHEmptyRecycleBinA(hwnd: HWND; pszRootPath: LPCTSTR; dwFlags: dword): HRESULT; stdcall
  {$EXTERNALSYM SHEmptyRecycleBinW} 
  function SHEmptyRecycleBinW(hwnd: HWND; pszRootPath: LPWSTR; dwFlags: dword): HRESULT; stdcall
  {$EXTERNALSYM SHEmptyRecycleBin} 
  function SHEmptyRecycleBin(hwnd: HWND; pszRootPath: LPCTSTR; dwFlags: dword): HRESULT; stdcall


implementation

{$R *.dfm}

const 
  shell32 = 'shell32.dll'

function SHQueryRecycleBinA; external shell32 name 'SHQueryRecycleBinA'
function SHQueryRecycleBinW; external shell32 name 'SHQueryRecycleBinW'
function SHQueryRecycleBin; external shell32 name 'SHQueryRecycleBinA'
function SHEmptyRecycleBinA; external shell32 name 'SHEmptyRecycleBinA'
function SHEmptyRecycleBinW; external shell32 name 'SHEmptyRecycleBinW';
function SHEmptyRecycleBin; external shell32 name 'SHEmptyRecycleBinA';


function PapierkorbItems: integer;
var
  RBInfo : TSHQueryRBInfo;
begin
  // Record leeren
  ZeroMemory(@RBInfo,sizeof(TSHQueryRBInfo));

  // Größe setzen
  RBInfo.cbSize := sizeof(TSHQueryRBInfo);

  // Funktion aufrufen
  if(SHQueryRecycleBin('',RBInfo) = S_OK) then
    // is´ was im Papierkorb drin?
    result:=RBInfo.i64NumItems;
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Label1.Caption:='Im Papierkorb befinden sich ' +
      IntToStr(PapierkorbItems) +
      ' Dateien';
end;

end.


Kannst Du Dir bitte den Code ansehen und mir sagen, was daran falsch ist.

Danke!

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.10.03 23:01 
schitho hat folgendes geschrieben:
Irgendwas stimmt an meinem Code nicht:

Sehr hilfreich, um dir zu helfen. Erscheint ein Fehler? Wenn ja: welcher? Oder lässt sich das Programm kompilieren, und du bekommst nur kein Ergebnis? ...

Zitat:
Kannst Du Dir bitte den Code ansehen und mir sagen, was daran falsch ist.

Nichts. Ich habe zwar keinen Timer sondern einen Button genommen, aber das ändert ja nicht viel. Und ich hab´s gerade unter 98 und XP getestet. (Oder vielleicht liegt´s am Timer ... ? ... ich wüsste zwar nicht wieso, ...)

Was ich aber an deiner Stelle machen würde: den ganzen Papierkorb-Code aus deiner Form-Unit rausnehmen und in eine extra Unit schreiben. Oder du holst dir die Beispielprogramme der Tutorials, da müsste IMHO meine "ShellAPI_Fragment.pas" drin stecken. Die enthält den ganzen Papierkorbkram und noch ein bisschen mehr.

Gruß.
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Do 02.10.03 23:16 
Sorry! Jetzt hab ich doch glatt vergessen den Fehler zu beschreiben! Peinlich, peinlich.... :oops:

Also es liefert immer das gleiche Ergebnis (unter W2000), egal ob eine Datei sich im Papierkorb befindet oder nicht:

Es befinden sich 12721944 Dateien im Papierkorb.

Das stimmt eindeutig nicht. :roll:

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 03.10.03 13:08 
Vorhin getestet unter Win 2000 Pro (wenn man schon wen besucht, dann auch wg. wirklich wichtigen Gründen :wink:) - ´s ging auch. Sorry.
NCortex
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 126

WIN 2000
D7 Enterprise
BeitragVerfasst: Fr 03.10.03 15:18 
Zitat:
Es befinden sich 12721944 Dateien im Papierkorb.


zähl mal nach, vllt hast du ja ein paar übersehen :-D

_________________
"...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Fr 03.10.03 20:57 
Bei mir liefert SHQueryRecycleBin('',RBInfo) nicht S_OK. Daher wird auch kein richtiges Ergebnis geliefert.

Hab in meinem Code den Timer entfernt und stattdessen auch einen Button eingefügt. Der Code sieht jetzt so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
unit PapTestUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls ;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  type 
  {$EXTERNALSYM _SHQUERYRBINFO}
  _SHQUERYRBINFO = 
    packed record
      cbSize  : DWORD; 
      i64Size : int64;
      i64NumItems : int64;
    end;
  {$EXTERNALSYM TSHQueryRBInfo} 
  TSHQueryRBInfo = _SHQUERYRBINFO;
  {$EXTERNALSYM PSHQueryRBInfo}
  PSHQueryRBInfo = ^TSHQueryRBInfo;

const
  {$EXTERNALSYM SHERB_NOCONFIRMATION} 
  SHERB_NOCONFIRMATION    = $00000001;
  {$EXTERNALSYM SHERB_NOPROGRESSUI} 
  SHERB_NOPROGRESSUI      = $00000002;
  {$EXTERNALSYM SHERB_NOSOUND} 
  SHERB_NOSOUND           = $00000004;

  {$EXTERNALSYM SHQueryRecycleBinA} 
  function SHQueryRecycleBinA(pszRootPath: LPCTSTR; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall;
  {$EXTERNALSYM SHQueryRecycleBinW}
  function SHQueryRecycleBinW(pszRootPath: LPWSTR; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall
  {$EXTERNALSYM SHQueryRecycleBin} 
  function SHQueryRecycleBin(pszRootPath: LPCTSTR; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall;
  {$EXTERNALSYM SHEmptyRecycleBinA} 
  function SHEmptyRecycleBinA(hwnd: HWND; pszRootPath: LPCTSTR; dwFlags: dword): HRESULT; stdcall;
  {$EXTERNALSYM SHEmptyRecycleBinW} 
  function SHEmptyRecycleBinW(hwnd: HWND; pszRootPath: LPWSTR; dwFlags: dword): HRESULT; stdcall
  {$EXTERNALSYM SHEmptyRecycleBin} 
  function SHEmptyRecycleBin(hwnd: HWND; pszRootPath: LPCTSTR; dwFlags: dword): HRESULT; stdcall


implementation

{$R *.dfm}

const 
  shell32 = 'shell32.dll'

function SHQueryRecycleBinA; external shell32 name 'SHQueryRecycleBinA'
function SHQueryRecycleBinW; external shell32 name 'SHQueryRecycleBinW';
function SHQueryRecycleBin; external shell32 name 'SHQueryRecycleBinA';
function SHEmptyRecycleBinA; external shell32 name 'SHEmptyRecycleBinA'
function SHEmptyRecycleBinW; external shell32 name 'SHEmptyRecycleBinW';
function SHEmptyRecycleBin; external shell32 name 'SHEmptyRecycleBinA';


function PapierkorbItems: integer;
var
  RBInfo : TSHQueryRBInfo;
begin
  // Record leeren
  ZeroMemory(@RBInfo,sizeof(TSHQueryRBInfo));

  // Größe setzen
  RBInfo.cbSize := sizeof(TSHQueryRBInfo);

  // Funktion aufrufen
  if(SHQueryRecycleBin('',RBInfo) = S_OK) then
    // is´ was im Papierkorb drin?
    result:=RBInfo.i64NumItems else
    result:=-1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     Label1.Caption:='Im Papierkorb befinden sich ' +
      IntToStr(PapierkorbItems) +
      ' Dateien';
end;

end.


Funktioniert aber trotzdem nicht :cry:

Als Ergebnis wird immer -1 geliefert.

(unter W2000 Pro SP 4)

lg
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Sa 04.10.03 01:01 
Noch ein Nachtrag:

Unter W98 funktioniert der obige Code. Unter W2000 Pro SP4 nicht.

Kann es daran liegen, dass ich unter W2000 sowohl NTFS und FAT32 Partitionen verwende??

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)