Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi THandle -- welchen Sinn und wie selbst erstellen? (https://www.delphipraxis.net/97366-thandle-welchen-sinn-und-wie-selbst-erstellen.html)

Pfoto 9. Aug 2007 11:08


THandle -- welchen Sinn und wie selbst erstellen?
 
Hallo zusammen!

nach ein wenig Ruhezeit habe ich mich mal wieder an mein
Programm gesetzt und die ersten Fragen / Fehler ließen
nicht lange auf sich warten... :?

ich verstehe die Verwendung des "Handle" nicht, besonders
bei folgender Funktion:

Delphi-Quellcode:
(******************************************************************************
CSIDL_COOKIES             Cookies
CSIDL_DESKTOPDIRECTORY    Desktop
CSIDL_FAVORITES           Favoriten
CSIDL_HISTORY             Internet-Verlauf
CSIDL_INTERNET_CACHE      "Temporary Internet Files"
CSIDL_PERSONAL            Eigene Dateien
CSIDL_PROGRAMS            "Programme" im Startmenü
CSIDL_RECENT              "Dokumente" im Startmenü
CSIDL_SENDTO              "Senden an" im Kontextmenü
CSIDL_STARTMENU           Startmenü
CSIDL_STARTUP             Autostart
CSIDL_COMMON_APPDATA      Ordner "Alle User"
*******************************************************************************)

function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;

Wenn ich die Funktion innerhalb in meiner Anwendung aufrufe
und dessen Handle verwende funktioniert alles
Delphi-Quellcode:
GetSpecialFolder(Handle, CSIDL_PERSONAL));
Ich wollte diese Funktion jedoch über eine Unit aufrufen
und habe schlicht dieses hier angegeben, was zu einem Absturz
führte:
Delphi-Quellcode:
var
  Handle: THandle;
begin
  result:= GetSpecialFolder(Handle, CSIDL_COMMON_APPDATA);
end;
Ich kann das Handle aber gar nicht über .Create erstellen und
über .free freigeben. Hat das mit Interfaces zu tun?
Ist ein Handle sowas wie ein Zeiger?
In der Delphi 2006 Hilfe finde ich merkwürdigerweise nur ein
THandle von Indy und sonst keinen Eintrag.

Wie kann ich nun ein korrektes Handle erstellen ohne das
von TApplication zu verwenden?



Also wer was darüber weiß und mich aufklären möchte, gerne!


Dank und Gruß
Pfoto

RavenIV 9. Aug 2007 11:11

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Der Handle ist gewissermassen ein "Zeiger" auf Deine Applikation.
Diesen Handle musst Du der Funktion mitgeben, damit sie weiss, wer der Parent der MessageBox ist.

DGL-luke 9. Aug 2007 11:11

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Hallo,

Handles werden von der WInAPI genutzt, um Controls (Fenster, Buttons etc.) zu identifizieren.
Das Handle, das diese Funktion will, kannst du entweder getrost auf 0 setzen (das ist der desktop), oder dein eigenes fentserhandle (wenn du in einer form bist, self.Handle) verwenden.

Luckie 9. Aug 2007 11:32

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Zitat:

Zitat von DGL-luke
Das Handle, das diese Funktion will, kannst du entweder getrost auf 0 setzen (das ist der desktop),

Womit das Fensterd ann modal zum Desktop wäre, was aber wohl bestimmt nicht beabsichtigt ist. Aber wo ist das Problem, auch wenn die Funktion in einer Unit steht, beim Aufruf das Handle zu übergeben?

Pfoto 9. Aug 2007 11:38

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Zitat:

Zitat von Luckie
Aber wo ist das Problem, auch wenn die Funktion in einer Unit steht, beim Aufruf das Handle zu übergeben?

Ich habe folgende Funktion in einer separaten Unit, um mir die
Konstanten zur oben genannten Funktionen nicht merken zu müssen:

Delphi-Quellcode:
function GetPathSingleUser: string;
begin
  result:= GetSpecialFolder(Handle, CSIDL_PERSONAL);
end;
In dieser Unit ist Application "Handle" ja unbekannt,
weswegen ich es erstellen wollte.

Aber wenn ich es, wie DGL-luke schreibt, einfach
ohne Probleme auf "0" setzen kann, scheint das Problem
ja gelöst zu sein.
Wobei ich immer noch nicht verstehe, warum gerade
diese Funktion ein Handle braucht -- sie liefert doch
einfach nur einen Systemordner von Windows zurück.

Pfoto

RavenIV 9. Aug 2007 11:41

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Das Handle wird benötigt wegen:
Delphi-Quellcode:
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
Die MessageBox muss ja wissen, zu wem sie gehört.
Wenn Du hier "0" mitgibst, dann bleibt evtl. die MessageBox offen, obwohl Dein Programm schon lange beendet wurde.

Aber vielleicht kannst Du für hWindow das Application.Handle mitgeben.

Luckie 9. Aug 2007 11:45

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Ich sehe immer noch nicht das Problem mit dem Handle:
Delphi-Quellcode:
function GetPathSingleUser(Handle: THandle): string;
begin
  result:= GetSpecialFolder(Handle, CSIDL_PERSONAL);
end;
Sie wird schon eins brauchen und zwar um zum Beispiel Benutzerspezifische Ordner zurück zu geben. Wenn du einen Prozess unter einem anderen Benutzerkonto startest, müssen ja die Ordner des zugehörigen Kontos ermittelt werden und nicht die des gerade angemeldeten Benutzers. Und ich denke, dazu wird das Handle benötigt. Über ein paar andere Funktion wird dann das Prizesshandle und dann entsprechend das Prozesstoken ermittelt. Und das Handle kann der Anwender eben am leichtesten angeben. Ein Prozesshandle ider eine ProzessID sind da schon etwas umständlicher zu bekommen.

@RavenIV: Diese API-Funktion hat kein Fenster. ;)

Pfoto 9. Aug 2007 11:55

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Zitat:

Zitat von Luckie
Ich sehe immer noch nicht das Problem mit dem Handle:
Delphi-Quellcode:
function GetPathSingleUser(Handle: THandle): string;
begin
  result:= GetSpecialFolder(Handle, CSIDL_PERSONAL);
end;

Du hast recht, ich kann natürlich auch hier das Handle von Application
mitgeben, ich wollte aber grundsätzlich verstehen, warum ich es hier
angeben muss.

Wenn ich Dich richtig verstanden haben, scheint es wirklich sinnvoll zu
sein, das Application.Handle mit anzugeben, anstatt eine "0" zu schreiben
-- wobei auch hiermit die Funktion einwandfrei lief.

Ok, danke an Alle!

Gruß
Pfoto

DGL-luke 10. Aug 2007 08:14

Re: THandle -- welchen Sinn und wie selbst erstellen?
 
Die "0" ist sozusagen die "Quick&Dirty"-Lösung ;-)
Natürlich läuft es, aber es kann Nebenwirkungen haben, wenn irgendwo anders was nicht absolut sauber läuft.


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