Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SHQueryRecycleBin: mysteriöses Verhalten (https://www.delphipraxis.net/115480-shqueryrecyclebin-mysterioeses-verhalten.html)

Mazel 12. Jun 2008 22:01


SHQueryRecycleBin: mysteriöses Verhalten
 
Guten Abend,

ich habe bei der oben genannten Funktion ein komisches Verhalten festgestellt, dass ich mir nicht erklären kann, zunächst einmal der Quellcode:
Delphi-Quellcode:
if SHQueryRecycleBin('', RecycleBinInfo) = S_OK then
  begin
   Result.RecycleItems := IntToStr(RecycleBinInfo.i64NumItems);
   Result.RecycleSize := GetStringSize(RecycleBinInfo.i64Size, 0);
  end
 else
  begin
   Result.RecycleItems := 'kein Papierkorb vorhanden';
   Result.RecycleSize := 'kein Papierkorb vorhanden';
  end;
...
...
 // ProfilName
 Result.ProfilName := GetMinimizedName(Main.ProfilName);
 // ProfilSize
 Result.ProfilSize := GetStringSize(GetDirSize(Main.ProfilName), 0);
 // TempName
 Result.TempName := GetMinimizedName(Main.TempName);
 // TempSize
 Result.TempSize := GetStringSize(GetDirSize(Main.TempName), 0);
Zur weiteren Information: GetDirSize, GetStringSize und GetMinimizedName sind eigene Funktionen die eine Verzeichnisgröße in Int64 ermittelt, eine Verzeichnisgröße in einem verständlichen String zurück gibt und einen zulangen String bei einem Slash abschneidet.

Das Problem welches besteht ist, dass so wie der Code hier steht, SHQueryRecycleBin nicht S_OK zurückgibt. Kommentiere ich "ProfilName und ProfilSize" oder "TempName und TempSize" aus, geht es.

Warum aber nicht so wie es ist? Die SHQueryRecycleBin-Funktion wird doch vorher aufgerufen und hat nichts mit den nachfolgenden Anweisungen zu tun.

Was passiert intern? Es hat den Anschein, als ob erst die 4 anderen Anweisungen verarbeitet werden und dann SHQueryRecycleBin, was irgendwie zu einer falschen Rückgabe führt.

Wenn mir jemand helfen kann, wär ich froh.

Danke
Mazel

Christian Seehase 12. Jun 2008 22:07

Re: SHQueryRecycleBin: mysteriöses Verhalten
 
Moin Marcel,

wie hast Du die Funktion den importiert?
Was gibt die Funktion zurück wenn sie fehlschlägt?

[EDIT]
Ich hab's mal so gemacht (und funktioniert):

Delphi-Quellcode:
type
  PSHQUERYBININFO = ^SHQUERYBININFO;
  SHQUERYBININFO = packed record
    cbSize     : DWORD;
    i64Size    : Int64;
    i64NumItems : Int64;
  end;

function SHQueryRecycleBin(const pszRootPath : PChar;const pSHQueryRBInfo : PSHQUERYBININFO) : HRESULT; stdcall; external 'shell32.dll' name 'SHQueryRecycleBinA';

procedure TForm1.btn1Click(Sender: TObject);

var
  rbInfo : SHQUERYBININFO;
  dwRes : DWORD;

begin
  rbInfo.cbSize := SizeOf(rbInfo);
  dwRes := SHQueryRecycleBin('',@rbInfo);
  ShowMessage(IntToStr(rbInfo.cbSize)+#13#10+
              IntToStr(rbInfo.i64Size)+#13#10+
              IntToStr(rbInfo.i64NumItems)+#13#10+
              IntToStr(dwRes));
end;
[/EDIT]

Mazel 12. Jun 2008 22:22

Re: SHQueryRecycleBin: mysteriöses Verhalten
 
Delphi-Quellcode:
type
 // Papierkorb Infos
 TSHQueryRBInfo = packed record
    cbSize     : LongWord;
    i64Size    : Int64;
    i64NumItems : Int64;
  end;

const
 DLL_SHELL     = 'shell32.dll';
...
...
function SHQueryRecycleBin(pszRootPath: PAnsiChar; var pSHQueryRBInfo: TSHQueryRBInfo): HRESULT; stdcall;
...
...
{--[SHQueryRecycleBin]---------------------------------------------------------}

function SHQueryRecycleBin; external DLL_SHELL name 'SHQueryRecycleBinA';
Wenn die Funktion fehlschlägt, dann gibts sie einen COM Fehlerwert (COM-defined error value, aus msdn).

Man sieht aber, dass S_OK nicht zurückgegeben wird, wenn die 4 nachfolgenden Anweisungen nicht auskommentiert sind, also muss sie ja fehlschlagen.

Ich werde mal dein Code ausprobieren und schauen, ich sehe, dass du ein paar Dinge anders machst.

[EDIT]
Die kleinen Korrekturen haben geholfen. Ich hatte nicht den Pointer übergeben sondern den Typ. Jetzt funktioniert es, auch wenn ich weiterhin nicht verstehe, dass das intern anders zu scheinen scheint.

Ich danke dir Christian :thumb:, du warst sehr schnell mit einer Antwort, finde ich super :)
[/EDIT]

Christian Seehase 12. Jun 2008 22:30

Re: SHQueryRecycleBin: mysteriöses Verhalten
 
Moin Marcel,

bei der Deklaration sehe ich nur einen Unterschied, nämlich die Verwendung von var statt const.
Da man in C, keine var-Parameter kennt, übernehme ich das, auch für Rückgabeparameter so, da es ja durchaus Funktionen gibt, bei denen man auch nil angeben kann, wenn man den Parameter ignorieren will, was bei einem var-Parameter aber nicht gut möglich ist.
Ausserdem finde ich, dass man so auch Beispiele leichter übernehmen kann.

Ich vermute mal, das Problem rührt daher, dass Du cbSize nicht initialisierst.

Mazel 12. Jun 2008 22:35

Re: SHQueryRecycleBin: mysteriöses Verhalten
 
Ich habe cbSize nicht initialisiert, richtig. Warum geht es dann aber, wenn ich ein Paar der 4 Anweisungen auskommentiere?

Christian Seehase 12. Jun 2008 22:42

Re: SHQueryRecycleBin: mysteriöses Verhalten
 
Moin Marcel,

das es zuerst nicht funktioniert hat, könnte daran liegen, dass die Funktion, durch die falsche cbSize-Angabe, versucht hat Speicher zu überschreiben, der anderweitig blockiert war, was durch das auskommentieren verhindert wurde.
Die Verwendung des var-Parameters ist ja auch nicht falsch, ich finde sie nur unpraktisch.
Nachdem ich es mal eben auf var umgebaut hatte, funktionierte es, wie erwartet ;-), immer noch.

Mazel 12. Jun 2008 22:50

Re: SHQueryRecycleBin: mysteriöses Verhalten
 
Moin,

ok, das könnte möglich sein. :wink: Ich werde es als const lassen, scheint wohl, wie du sagts, in einigen Fällen doch praktischer zu sein. Ich bin jedenfalls jetzt froh, dass das Problem gelöst ist.

Danke nochmals und gute Nacht und schönen Freitag ;).


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 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