Autor |
Beitrag |
schitho
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: Do 02.10.03 18:29
Hi,
ich verwende folgenden Code, um zu prüfen, ob der Papierkorb leer ist:
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; 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
|
Verfasst: 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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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
      
Beiträge: 1099
Erhaltene Danke: 2
|
Verfasst: Do 02.10.03 21:35
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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:
Delphi-Quelltext 1: 2:
| var RBInfo : TSHQueryRBInfo; |
Und dann geht´s los:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ZeroMemory(@RBInfo,sizeof(TSHQueryRBInfo));
RBInfo.cbSize := sizeof(TSHQueryRBInfo);
if(SHQueryRecycleBin('',RBInfo) = S_OK) then if(RBInfo.i64NumItems > 0) then |
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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: Do 02.10.03 22:29
Danke für Deine Hilfe.
Trotzdem schaff ich es leider noch nicht ein vernünftiges Ergebnis zu bekommen.
Irgendwas stimmt an meinem Code nicht:
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 public 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 ZeroMemory(@RBInfo,sizeof(TSHQueryRBInfo));
RBInfo.cbSize := sizeof(TSHQueryRBInfo);
if(SHQueryRecycleBin('',RBInfo) = S_OK) then 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
|
Verfasst: 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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: Do 02.10.03 23:16
Sorry! Jetzt hab ich doch glatt vergessen den Fehler zu beschreiben! Peinlich, peinlich....
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.
Gruß
Thomas
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 03.10.03 13:08
Vorhin getestet unter Win 2000 Pro (wenn man schon wen besucht, dann auch wg. wirklich wichtigen Gründen  ) - ´s ging auch. Sorry.
|
|
NCortex
      
Beiträge: 126
WIN 2000
D7 Enterprise
|
Verfasst: 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 
_________________ "...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
|
|
schitho 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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:
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 public 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 ZeroMemory(@RBInfo,sizeof(TSHQueryRBInfo));
RBInfo.cbSize := sizeof(TSHQueryRBInfo);
if(SHQueryRecycleBin('',RBInfo) = S_OK) then 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
Als Ergebnis wird immer -1 geliefert.
(unter W2000 Pro SP 4)
lg
Thomas
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
schitho 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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)
|
|