Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi hProcess aus dwProcessId bekommen? (https://www.delphipraxis.net/128633-hprocess-aus-dwprocessid-bekommen.html)

gandime 3. Feb 2009 00:19


hProcess aus dwProcessId bekommen?
 
Hi,
ich würde gerne wissen wie ich den hProcess aus einer dwProcessId bekomme?
Hab schon nen bissel gesucht aber bis jetzt läuft das nicht ganz so :/
Delphi-Quellcode:
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, true, dwProcessId);
Ich bekomme immer den Rückgabewert 0.
Liegt es vlt an Vista?

mfg
gandime

Luckie 3. Feb 2009 00:25

Re: hProcess aus dwProcessId bekommen?
 
Welches Betriebssystem? Was sagt MSDN-Library durchsuchenGetLastError?

gandime 3. Feb 2009 00:36

Re: hProcess aus dwProcessId bekommen?
 
oh ich hatte dwProcessId ausversehen nicht zugewiesen^^
aber trotzdem bekomme ich nicht den richtigen hProcess den ich möchte^^
Delphi-Quellcode:
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  i:integer;
begin
  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  StartInfo.cb := SizeOf(TStartupInfo);
  CreateProcess(nil,Pchar('notepad'),nil,nil,False,0,nil,nil,StartInfo,ProcInfo);
Diesen ProcInfo.hProcess hätte ich gerne.
Aber von einem bereits gestarteten Process!

jaenicke 3. Feb 2009 00:46

Re: hProcess aus dwProcessId bekommen?
 
Zitat:

Zitat von gandime
Ich bekomme immer den Rückgabewert 0.
Liegt es vlt an Vista?

Nicht direkt, aber wenn du keine Zugriffsrechte auf den anderen Prozess hast, dann bekommst du 0 zurück. Das merkst du nur unter XP nicht so, weil man standardmäßig mehr Rechte hatte.

Kann es sein, dass es sich um einen Systemprozess oder einen anderen unter einem anderen Benutzerkonto ausgeführten Prozess handelt? ;-)

Das von Luckie angesprochene GetLastError wird in dem Fall den Fehler 5 zurückgeben:
"Zugriff verweigert"
Delphi-Quellcode:
ShowMessage('Fehler ' + IntToStr(GetLastError) + ': ' + SysErrorMessage(GetLastError));
// EDIT:
Die Benachrichtigung über Antworten geht wohl irgendwie nicht richtig. Die Antwort habe ich nicht gesehen bei der Antwort.

Zitat:

Zitat von gandime
aber trotzdem bekomme ich nicht den richtigen hProcess den ich möchte^^

Wie nicht richtig? 0 oder woran siehst du, dass es nicht das richtige Handle ist?

gandime 3. Feb 2009 01:00

Re: hProcess aus dwProcessId bekommen?
 
Meinen letzten Post beachten!
das Problem mit dem Rückgabewert 0 war meine schuld.

hab folgenden Code Gefunden, der Die dwProcessId aus einem hProcess bekommt.
Dafür reicht es warscheinlich folgenden Codeschnipsel zu modifizieren:
Delphi-Quellcode:
  if not Assigned(FNGetProcessId) then
    FNGetProcessId := TFNGetProcessId(
      GetProcAddress(GetModuleHandle(kernel32), 'GetProcessId'));
  if Assigned(FNGetProcessId) then
    Result := FNGetProcessId(Process)
Anstatt "GetProcessId" bestimmt etwas anderes aber was?^^

Zum Testen habe ich folgendes geschreiben:
Delphi-Quellcode:
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  i:integer;
begin
  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  StartInfo.cb := SizeOf(TStartupInfo);
  CreateProcess(nil,Pchar('notepad'),nil,nil,False,0,nil,nil,StartInfo,ProcInfo);
  sleep(1000);
  if OpenProcess(PROCESS_CREATE_PROCESS , false, ProcInfo.dwProcessId)=ProcInfo.hProcess then
    showmessage('ok')
  else
    showmessage('nö');
und es sind unterschiedliche hProcess!

jaenicke 3. Feb 2009 01:06

Re: hProcess aus dwProcessId bekommen?
 
Zitat:

Zitat von gandime
Meinen letzten Post beachten!
das Problem mit dem Rückgabewert 0 war meine schuld.

Das habe ich ja dann auch dazu editiert, ich hatte die Antwort nicht angezeigt bekommen. ;-)

Zitat:

Zitat von gandime
und es sind unterschiedliche hProcess!

Das heißt aber ja nicht, dass die falsch sind. Du kannst ja verschiedene Handles zum selben Prozess haben.

Das kannst du durch wiederholten Aufruf von OpenProcess ja auch ausprobieren, du bekommst verschiedene weitere Handles. Und du kannst mit diesen verschiedenen Handles trotzdem z.B. die Priorität des selben Prozesses verändern.

Luckie 3. Feb 2009 01:07

Re: hProcess aus dwProcessId bekommen?
 
Was willst du denn eigentlich mit dem Prozesshandle machen und warum nimmst du gerade PROCESS_CREATE_PROCESS als Zugriffsrecht?

gandime 3. Feb 2009 01:44

Re: hProcess aus dwProcessId bekommen?
 
ich weiss auch nicht warum es nicht funktioniert hat aber ich konnte CreateRemoteThread() nicht mit dem HProcess aufrufen Oo
jetzt funktioniert es aber wunderbar
danke

jaenicke 3. Feb 2009 01:48

Re: hProcess aus dwProcessId bekommen?
 
Zitat:

Zitat von gandime
ich weiss auch nicht warum es nicht funktioniert hat aber ich konnte CreateRemoteThread() nicht mit dem HProcess aufrufen Oo

Naja, am Anfang hattest du als Parameter PROCESS_QUERY_INFORMATION übergeben. Mit einem so erhaltenen Handle kannst du eben auch nur das tun: Informationen abfragen...

Du brauchst aber mehrere Rechte, diese stehen in der Dokumentation zu CreateRemoteThread:
Zitat:

A handle to the process in which the thread is to be created. The handle must have the PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE, and PROCESS_VM_READ access rights.

mr_emre_d 3. Feb 2009 04:52

Re: hProcess aus dwProcessId bekommen?
 
Delphi-Quellcode:
hWnd, dwPid,
hProcess: Cardinal;
begin
  hWnd := FindWindow('Notepad', 0);
  if hWnd <> 0 then
  begin
    GetWindowThreadProcessID( hWnd, dwPid );
    if dwPid <> 0 then
    begin
      hProcess := OpenProcess( PROCESS_ALL_ACCESS, False, dwPid );
      if hProcess <> 0 then
      begin
        // code
      end else
        // Errorbehandlung
    end else
      // Errorbehandlung
  end else
    // Errorbehandlung
end;


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