AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SHQueryRecycleBin: mysteriöses Verhalten
Thema durchsuchen
Ansicht
Themen-Optionen

SHQueryRecycleBin: mysteriöses Verhalten

Ein Thema von Mazel · begonnen am 12. Jun 2008 · letzter Beitrag vom 12. Jun 2008
Antwort Antwort
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:01
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:07
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.dllname '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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#3

Re: SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:22
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 , du warst sehr schnell mit einer Antwort, finde ich super
[/EDIT]
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:30
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#5

Re: SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:35
Ich habe cbSize nicht initialisiert, richtig. Warum geht es dann aber, wenn ich ein Paar der 4 Anweisungen auskommentiere?
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:42
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#7

Re: SHQueryRecycleBin: mysteriöses Verhalten

  Alt 12. Jun 2008, 22:50
Moin,

ok, das könnte möglich sein. 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 .
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:50 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