Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit Zuordnung der Handle eines Processes (https://www.delphipraxis.net/166964-problem-mit-zuordnung-der-handle-eines-processes.html)

Helmi 7. Mär 2012 17:45

Problem mit Zuordnung der Handle eines Processes
 
Hallo,

ich habe folgende Procedure um eine Datei zu starten und dessen Fenster zu verstecken:
Delphi-Quellcode:
procedure start_Process(const FileName: String; out HWindow: HWND; out Process: Cardinal);

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
   begin
     TList(lParam).Add(Pointer(hWnd));
     Result := True;
   end;

var
   i         : Integer;
   StartupInfo: TStartupInfo;
   ProcessInfo: TProcessInformation;
   List      : TList;
   ProcessId : DWORD;

begin
  If not FileExists(FileName) then
    exit;

  List := TList.Create;

  try
    //Variable mit nullen auffüllen und Größe setzen
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
    StartupInfo.cb := SizeOf(TStartupInfo);

    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := SW_HIDE;

    If CreateProcess(nil, PChar(FileName + #0), nil, nil, false, 0, nil, nil,
                      StartupInfo, ProcessInfo) then
      begin
        WaitForInputIdle(ProcessInfo.hProcess, INFINITE);

        If EnumWindows(@EnumWindowsProc, Integer(List)) then
          for i := 0 to Pred(List.Count) do
            begin
              GetWindowThreadProcessId(Integer(List.Items[i]), ProcessId);

              If ProcessInfo.dwProcessId = ProcessId then
                begin
                  HWindow := Integer(List.Items[i]);

                  Process := ProcessInfo.hProcess;

                  break;
                end;
            end;

        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
      end;
  finally
    //Liste löschen und freigeben
    FreeAndNil(List);
  end;
end;

Diese Funktion nutz ich um den Exenamen zu erhalten:
Delphi-Quellcode:
function GetProcessExeName(hProcess: THandle): String;
var
   lpBuffer: array[0..MAX_PATH -1] of Char;
begin
  ZeroMemory(@lpBuffer, SizeOf(lpBuffer));
  If GetModuleFileNameEx(hProcess, 0, lpBuffer, SizeOf(lpBuffer)) > 0 then
    Result := String(lpBuffer)
  else
    Result := SyserrorMessage(GetlastError);
end;

Und diese Funktion um den Titel auszulesen:
Delphi-Quellcode:
function GetWindowText(Wnd: HWND): String;
var
   WndCaption: PWideChar;
   len: Integer;

begin
   len := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);

   If len > 0 then
     begin
       len := len * 2;
       WndCaption := GetMemory(len + 1);

       If Assigned(WndCaption) then
       begin
         SendMessageW(Wnd, WM_GETTEXT, len + 1, Integer(WndCaption));

         Result := String(WndCaption);

         FreeMemory(WndCaption);
       end;
     end;
end;
Ich hab jetzt das Problem, welchen Handle ich zu welcher Funktion nutze.

Also für die letzte Funktion kann ich dieses Handle nutzen aus der ersten Procedure
Delphi-Quellcode:
HWindow := Integer(List.Items[i]);
Nur welches Handle brauch ich für die zweite Funktion?
Ich hab es mit beiden ausprobiert, aber jedesmal erhalte ich als Systemfehlermeldung "Handle ungültig"

Wen muss man bestechen um eine ordentliche Codeformatierung zu erhalten?

Luckie 7. Mär 2012 17:54

AW: Problem mit Zuordnung der Handle eines Processes
 
Sagt doch schon der Datentyp: HWD, ein Fenster Handle, welches man mit FindWindow oder EnumWindows bekommt.

Helmi 7. Mär 2012 17:56

AW: Problem mit Zuordnung der Handle eines Processes
 
Argl!
Ich komm einfach ins Alter!

Ich meinte natürlich nicht die letzte Funktion sondern die zweite!

Ich werds oben korrigieren

DeddyH 7. Mär 2012 18:06

AW: Problem mit Zuordnung der Handle eines Processes
 
Das sollte eigentlich das Prozesshandle sein, also das, was Du in Process ausgibst.

Helmi 7. Mär 2012 18:10

AW: Problem mit Zuordnung der Handle eines Processes
 
Zitat:

Zitat von DeddyH (Beitrag 1155188)
Das sollte eigentlich das Prozesshandle sein, also das, was Du in Process ausgibst.

Dacht ich auch - nur bekomme ich mit diesem Handle auch die Meldung "Handle ungültig".

DeddyH 7. Mär 2012 18:12

AW: Problem mit Zuordnung der Handle eines Processes
 
Vielleicht wird das u.U. nicht zugewiesen, initialisiert ist es ja auch nicht. Setz doch die Zeile
Zitat:

Delphi-Quellcode:
Process := ProcessInfo.hProcess;

mal spaßeshalber vor das WaitForInputIdle.

Helmi 7. Mär 2012 18:14

AW: Problem mit Zuordnung der Handle eines Processes
 
Zitat:

Zitat von DeddyH (Beitrag 1155191)
Vielleicht wird das u.U. nicht zugewiesen, initialisiert ist es ja auch nicht. Setz doch die Zeile
Zitat:

Delphi-Quellcode:
Process := ProcessInfo.hProcess;

mal spaßeshalber vor das WaitForInputIdle.

Leider gleiches Ergebnis

DeddyH 7. Mär 2012 18:20

AW: Problem mit Zuordnung der Handle eines Processes
 
Könnte das mit dem CloseHandle zusammenhängen?

Helmi 7. Mär 2012 18:23

AW: Problem mit Zuordnung der Handle eines Processes
 
Zitat:

Zitat von DeddyH (Beitrag 1155197)
Könnte das mit dem CloseHandle zusammenhängen?

Ähm - also - wie soll ich sagen *hüstel* - ist scho a bisserl peinlich *hüstel*

Das war das Problem! - Irgendwie logisch!

Dank dir!

DeddyH 7. Mär 2012 18:33

AW: Problem mit Zuordnung der Handle eines Processes
 
Nicht weitersagen: ich bin da auch erst drauf gekommen, nachdem ich nochmal im MSDN unter CreateProcess nachgeschaut hatte und das CloseHandle mir dann in den Bemerkungen ins Auge sprang :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Seite 1 von 2  1 2      

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