AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Handle eines Programmes - nur Pfad bekannt
Thema durchsuchen
Ansicht
Themen-Optionen

Handle eines Programmes - nur Pfad bekannt

Ein Thema von Mazel · begonnen am 9. Dez 2005 · letzter Beitrag vom 9. Dez 2005
Antwort Antwort
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 13:15
Hi,

hab ein großes Problem. Ich bin gerade dabei ein eine Art Schnellstarter zu programmieren. Man gibt in ein EditFeld einen Pfad Beispiel: C:\Programme\MeinProgramm\Programm.exe ein. Nun will ich aber nicht nur das Programm staren sonder auch noch das Handle. Auch wenn es in der TNA also rechts neben der Uhr liegt, und sonst kein Fenster erscheint. Ist das überhaupt möglich?


Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 13:32
Such alle Programmhandles und teste bei einem nach dem anderen ob es den entsprechenden Pfad hat.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 14:46
Zitat von Mazel:
Nun will ich aber nicht nur das Programm staren sonder auch noch das Handle.
Welche Funktion benutzt um das Programm zu starten?
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#4

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 16:15
Hi,

danke erstmal für die Antworten.

@ichbins:

wie kann ich alle Fensterhandles bekommen, hab es mit FindWindow probiert, da kommt aber als Handle immer 0.

@NicoDE:

aufrufen tue ich die Programme mit ShellExecute

ShellExecute(Application.Handle, 'open' , PChar(Edit1.Text), nil, nil, sw_ShowNormal); Dieses Application.Handle ist doch das Handle meines Programmes, daher weis ich nicht wie ich an das Handle der aufrufenden Datei heran komme.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 16:20
Schau dir mal die Unit processinfo von Luckie an. Mit der hab ich schon ne Art taskmanager programmiert. Daraus habe ich folgende Unit extrahiert:

Delphi-Quellcode:
unit Process;

interface

uses
  windows,tlhelp32;

type
  tprocessarray=array of tprocessentry32;

procedure actprocesses;

var
  processes:tprocessarray;

implementation

function EnableDebugPrivileges(bEnable: Boolean; var PreviousState: Boolean): DWORD;
const
  SE_DEBUG_NAME = 'SeDebugPrivilege';
var
  Token: THandle;
  NewState: TTokenPrivileges;
  Luid: TLargeInteger;
  PrevState: TTokenPrivileges;
  Return: DWORD;
begin
  PreviousState := TRUE;
  if (GetVersion() > $80000000) then
    // Win9x
    Result := ERROR_SUCCESS
  else
  begin
    // WinNT
    if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
      Result := GetLastError()
    else
    try
      if not LookupPrivilegeValue(nil, SE_DEBUG_NAME, Luid) then
        Result := GetLastError()
      else
      begin
        NewState.PrivilegeCount := 1;
        NewState.Privileges[0].Luid := Luid;
        if bEnable then
          NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          NewState.Privileges[0].Attributes := 0;
        if not AdjustTokenPrivileges(Token, False, NewState,
          SizeOf(TTokenPrivileges), PrevState, Return) then
          Result := GetLastError()
        else
        begin
          Result := ERROR_SUCCESS;
          PreviousState := (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
        end;
      end;
    finally
      CloseHandle(Token);
    end;
  end;
end;

function Getprocesses(var processes:tprocessarray): Integer;
var
  hSnapShot : Cardinal;
  pe32 : TProcessEntry32;
  cntP : Integer;
  v : boolean;
begin
  setlength(processes,0);
  EnableDebugPrivileges(true,v);
  result := 0;
  hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hSnapShot <> 0 then
  begin
    ZeroMemory(@pe32, sizeof(pe32));
    pe32.dwSize := sizeof(ProcessEntry32);
    cntP := 0;
    if Process32First(hSnapShot, pe32) = true then
    begin
      while Process32Next(hSnapShot, pe32) = true do
      begin
        setlength(processes,length(processes)+1);
         processes[length(processes)-1]:=pe32;
        Inc(cntP);
      end;
      result := cntP;
    end;
  end;
   EnableDebugPrivileges(false,v);
end;

procedure actprocesses;
begin
  getprocesses(processes);
end;

initialization
  getprocesses(processes);

end.
Angehängte Dateien
Dateityp: pas processinfo_514.pas (7,5 KB, 10x aufgerufen)
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#6

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 16:49
Danke, werde mir mal die Unit anschauen.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 16:57
Zitat von Mazel:
aufrufen tue ich die Programme mit ShellExecute
An das Prozess-Handle gelangst du nur durch die Verwendung von MSDN-Library durchsuchenShellExecuteEx.

Zitat von Mazel:
Dieses Application.Handle ist doch das Handle meines Programmes[...]
Nun ist die Frage was du unter "Handle meines Prozesses" verstehst. Application.Handle ist das Fenster-Handle vom Eintrag in der Task-Leiste.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#8

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 17:22
Hab nun folgendes probiert, aber das funktioniert nicht:

Delphi-Quellcode:
procedure TForm1.BtnStartClick(Sender: TObject);
var
  Wnd: HWnd;

begin
  ShellExecute(Wnd, 'open' , PChar(Edit1.Text), nil, nil, sw_ShowNormal);
  If Wnd <> 0 then ShowMessage(IntToStr(Wnd));
end;
@NicoDE: Danke für den Hinweis von Application.Handle.


Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#9

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 18:01
Hier mal ein Beispiel mit ShellExecuteEx:
Delphi-Quellcode:
uses
  ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
  SEEInfo: TShellExecuteInfo;
begin
  ZeroMemory(@SEEInfo, SizeOf(TShellExecuteInfo));
  with SEEInfo do
  begin
    cbSize := SizeOf(TShellExecuteInfo);
    fMask := SEE_MASK_DOENVSUBST or
              SEE_MASK_FLAG_NO_UI or
              SEE_MASK_NOCLOSEPROCESS;
    Wnd := Handle;
    lpVerb := 'open';
    lpFile := PChar(Trim(Edit1.Text));
    nShow := SW_SHOWDEFAULT;
  end;
  if not ShellExecuteEx(@SEEInfo) then
    ShowMessage(SysErrorMessage(GetLastError()))
  else
    if SEEInfo.hProcess = 0 then
      ShowMessage('Kein Prozess-Handle!')
    else
      try
        // Warten bis Anwendung initialisiert ist...
        WaitForInputIdle(SEEInfo.hProcess, INFINITE);
        ShowMessage('ok');
        // Warten bis Anwendung beendet ist...
        WaitForSingleObject(SEEInfo.hProcess, INFINITE);
        ShowMessage('done');
      finally
        CloseHandle(SEEInfo.hProcess);
      end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#10

Re: Handle eines Programmes - nur Pfad bekannt

  Alt 9. Dez 2005, 18:23
Danke für den Code, funktioniert sehr gut.
Marcel Jänicke
www.mj-software.net
  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 07:17 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