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:
Ich wollte diese Funktion jedoch über eine Unit aufrufen
GetSpecialFolder(Handle, CSIDL_PERSONAL));
und habe schlicht dieses hier angegeben, was zu einem Absturz führte:
Delphi-Quellcode:
Ich kann das Handle aber gar nicht über .Create erstellen und
var
Handle: THandle; begin result:= GetSpecialFolder(Handle, CSIDL_COMMON_APPDATA); end; ü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 |
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. |
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. |
Re: THandle -- welchen Sinn und wie selbst erstellen?
Zitat:
|
Re: THandle -- welchen Sinn und wie selbst erstellen?
Zitat:
Konstanten zur oben genannten Funktionen nicht merken zu müssen:
Delphi-Quellcode:
In dieser Unit ist Application "Handle" ja unbekannt,
function GetPathSingleUser: string;
begin result:= GetSpecialFolder(Handle, CSIDL_PERSONAL); end; 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 |
Re: THandle -- welchen Sinn und wie selbst erstellen?
Das Handle wird benötigt wegen:
Delphi-Quellcode:
Die MessageBox muss ja wissen, zu wem sie gehört.
MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
'SHGetMalloc(pMalloc)', 16); 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. |
Re: THandle -- welchen Sinn und wie selbst erstellen?
Ich sehe immer noch nicht das Problem mit dem Handle:
Delphi-Quellcode:
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.
function GetPathSingleUser(Handle: THandle): string;
begin result:= GetSpecialFolder(Handle, CSIDL_PERSONAL); end; @RavenIV: Diese API-Funktion hat kein Fenster. ;) |
Re: THandle -- welchen Sinn und wie selbst erstellen?
Zitat:
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 |
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