AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi THandle -- welchen Sinn und wie selbst erstellen?
Thema durchsuchen
Ansicht
Themen-Optionen

THandle -- welchen Sinn und wie selbst erstellen?

Ein Thema von Pfoto · begonnen am 9. Aug 2007 · letzter Beitrag vom 10. Aug 2007
Antwort Antwort
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#1

THandle -- welchen Sinn und wie selbst erstellen?

  Alt 9. Aug 2007, 11:08
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
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
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

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

  Alt 9. Aug 2007, 11:11
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 9. Aug 2007, 11:11
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 9. Aug 2007, 11:32
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 9. Aug 2007, 11:38
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
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#6

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

  Alt 9. Aug 2007, 11:41
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 9. Aug 2007, 11:45
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 9. Aug 2007, 11:55
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
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#9

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

  Alt 10. Aug 2007, 08:14
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  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 18:39 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