Entwickler-Ecke

Windows API - Handle eines selbst geöffneten Ordners auslesen


Xabitire - Do 06.08.09 10:47
Titel: Handle eines selbst geöffneten Ordners auslesen
Hi Leute,

ich bin grad am verzweifeln! Ich benutze folgenden Code um ein einfaches Ordnerfenster zu öffnen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if DirectoryExists(path) then
  begin
    ZeroMemory(@sei,sizeof(TShellExecuteInfo));
    sei.cbsize := sizeof(TShellExecuteInfo);
    sei.nShow := SW_SHOWNORMAL;
    sei.lpVerb := 'open';
    sei.lpDirectory := PChar(Path);

    ShellExecuteEx(@sei);

    Result := sei.Wnd;
  end;

Und jetzt hätte ich gern das Fenster-Handle des geöffneten Fensters, was ich, wie man sieht, versuche in Zeile 11 auszulesen! Allerdings bekomme ich immer nur Null zurück! Auch für sei.hProcess! Weis jemand was ich falsch mache? Oder funktioniert dieses Verfahren etwa nur bei Programmen?

Mit Freundlichen Grüßen

Felix


Xabitire - Fr 07.08.09 12:55

Habe jetzt mal noch ein bisschen rumprobiert und es sind eher noch mehr Fragen aufgetaucht, als zuvor! Gebe ich beim obigem Code noch zusätzlich sei.fMask  := SEE_MASK_NOCLOSEPROCESS; bekomme ich mal zumindestens bei Programmen ein Prozess-Handle zurück! Der Haken an der Sache ist, das dieses Handle scheinbar gar nicht existiert! Sowohl TerminateProcess, was ich zum Testen verwendet habe, zeigt keine Wirkung, wie auch andere Abfragen (z.B. GetModuleFileNameEx) geben nichts zurück!

Daher nochmal die Frage, habe ich da irgendwas falsch verstanden oder bleibt das ganze weiterhin ein Mysterium? :gruebel:

Ubrigens bei CreateProcess genau das selbe Problem! Bekomme zwar ein Prozess-Handle zurück, aber das wars auch schon.


jaenicke - Fr 07.08.09 16:25

Ich weise einmal auf die Dokumentation hin...
http://msdn.microsoft.com/en-us/library/bb759784.aspx hat folgendes geschrieben:
hwnd
Optional. A window handle to any message boxes that the system might produce while executing this function. This value can be NULL.
Das ist ein Parameter, den du angeben kannst, da du das nicht tust, ist der danach natürlich auch nicht gesetzt...

http://msdn.microsoft.com/en-us/library/bb759784.aspx hat folgendes geschrieben:
hProcess
A handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Internet Explorer is already running, it will display the document.
Das heißt es muss da auch nicht immer etwas drin stehen, wenn du einen Pfad öffnest. Da eine neue Instanz des Explorers gestartet werden wird, sollte es aber der Fall sein.

Warum TerminateProcess nicht geht, steht ebenfalls in der Dokumentation:
http://msdn.microsoft.com/en-us/library/ms686714.aspx hat folgendes geschrieben:
hProcess [in]
A handle to the process to be terminated.

The handle must have the PROCESS_TERMINATE access right.
Das Zugriffsrecht hast du dir vermutlich nicht geholt. Denn beim Erzeugen des Prozesses wird es ShellExecuteEx sicherlich nicht einfach so geholt haben...


Xabitire - Sa 08.08.09 10:55

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
http://msdn.microsoft.com/en-us/library/ms686714.aspx hat folgendes geschrieben:
hProcess [in]
A handle to the process to be terminated.

The handle must have the PROCESS_TERMINATE access right.
Das Zugriffsrecht hast du dir vermutlich nicht geholt. Denn beim Erzeugen des Prozesses wird es ShellExecuteEx sicherlich nicht einfach so geholt haben...

Danke, genau diese Information hat mir fürs Verständnis noch gefehlt! Ich werde mir wohl angewöhnen müssen mir die Dokumentation wirklich genau anzusehen. Der Hase liegt da ja oft im Detail vergraben :) ! Hatte eigentlich mehr einen Denkfehler, der jetzt problemlos behoben werden konnte.

Danke nochmals!

Mit freundlich Grüßen

Felix