![]() |
Probleme mit SHQueryRecycleBin in einer 64Bit Anwendung
Hallo zusammen,
ich benutze die folgenden zwei Funktionen in einer 32Bit-Anwendung um die Größe des Papierkorbes zu ermitteln :
Delphi-Quellcode:
Die Ermittlung der Größe des Papierkorbes und die Anzahl der Dateien funktioniert in einer 32Bit Anwendung hervorragend. Bei einer 64Bit Anwendung wird mir aber lediglich nur 0 für die Größe und für die Anzahl der Dateien ausgegeben. Was muss ich ändern, damit die Funktion in einer 64Bit Anwendung funktinoinert ?
type
// // Declarations for the infos about the recycle bin // PSHQueryRBInfo = ^TSHQueryRBInfo; TSHQueryRBInfo = packed record cbSize: DWORD; i64Size: Int64; i64NumItems: Int64; end; function SHQueryRecycleBin(szRootPath: PAnsiChar; SHQueryRBInfo: PSHQueryRBInfo): HResult; stdcall; external 'shell32.dll' Name 'SHQueryRecycleBinA'; {...} function GetDllVersion(FileName: string): Integer; var InfoSize, Wnd: DWORD; VerBuf: Pointer; FI: PVSFixedFileInfo; VerSize: DWORD; begin Result := 0; InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); if InfoSize <> 0 then begin GetMem(VerBuf, InfoSize); try if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then Result := FI.dwFileVersionMS; finally FreeMem(VerBuf); end; end; end; function RecycleBinInfo(const Drive: PAnsiChar; out BinSize, FileCount: Int64): Boolean; var DllVersion : integer; SHQueryRBInfo : TSHQueryRBInfo; r : HResult; begin Result := true; BinSize := 0; FileCount := 0; DllVersion := GetDllVersion(PChar('shell32.dll')); if DllVersion >= $00040048 then begin FillChar(SHQueryRBInfo, SizeOf(TSHQueryRBInfo), #0); SHQueryRBInfo.cbSize := SizeOf(TSHQueryRBInfo); R := SHQueryRecycleBin(Drive, @SHQueryRBInfo); if r = s_OK then begin BinSize := SHQueryRBInfo.i64Size; FileCount := SHQueryRBInfo.i64NumItems; end else Result := false; end; end; |
AW: Probleme mit SHQueryRecycleBin in einer 64Bit Anwendung
Delphi-Quellcode:
Geht: BDS2006, Windows 7 64-Bit.
type
// // Declarations for the infos about the recycle bin // PSHQueryRBInfo = ^TSHQueryRBInfo; TSHQueryRBInfo = packed record cbSize: DWORD; i64Size: Int64; i64NumItems: Int64; end; function SHQueryRecycleBin(szRootPath: PAnsiChar; SHQueryRBInfo: PSHQueryRBInfo): HResult; stdcall; external 'shell32.dll' Name 'SHQueryRecycleBinA'; {...} function GetDllVersion(FileName: string): Integer; var InfoSize, Wnd: DWORD; VerBuf: Pointer; FI: PVSFixedFileInfo; VerSize: DWORD; begin Result := 0; InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); if InfoSize <> 0 then begin GetMem(VerBuf, InfoSize); try if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then Result := FI.dwFileVersionMS; finally FreeMem(VerBuf); end; end; end; procedure RecycleBinInfo(const Drive: PAnsiChar; out BinSize, FileCount: Int64); var DllVersion : integer; SHQueryRBInfo : TSHQueryRBInfo; r : HResult; begin DllVersion := GetDllVersion(PChar('shell32.dll')); if DllVersion >= $00040048 then begin FillChar(SHQueryRBInfo, SizeOf(TSHQueryRBInfo), #0); SHQueryRBInfo.cbSize := SizeOf(TSHQueryRBInfo); R := SHQueryRecycleBin(Drive, @SHQueryRBInfo); if r = s_OK then begin BinSize := SHQueryRBInfo.i64Size; FileCount := SHQueryRBInfo.i64NumItems; end else RaiseLastOSError(); end; end; procedure TForm2.Button1Click(Sender: TObject); var CountFiles, BinSize: Int64; begin try RecycleBinInfo('c:', BinSize, CountFiles); ShowMessage(IntToStr(CountFiles)); except on E: Exception do ShowMessage(E.Message); end; end; |
AW: Probleme mit SHQueryRecycleBin in einer 64Bit Anwendung
@Luckie: Ich glaube Rolf bezog sich eher auf die Architektur des Programms selbst, als auf die Systemarchitektur. :)
Ändere mal das Info Struct folgendermaßen ab:
Delphi-Quellcode:
Damit funkioniert es für mich sowohl als 32, als auch als 64 bit Kompilat.
type
PSHQueryRBInfo = ^TSHQueryRBInfo; TSHQueryRBInfo = packed record cbSize: NativeUInt; i64Size: Int64; i64NumItems: Int64; end; |
AW: Probleme mit SHQueryRecycleBin in einer 64Bit Anwendung
Hallo Zacherl,
danke für Deine Antwort. Es funktioniert so wie Du es beschrieben hast. Ich habe durch das DWord den Befehl so zusagen auf eine 32Bit Architektur beschränkt, wenn ich die Hilfe richtig verstanden habe. Danke, habe wieder etwas dazu gelernt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz