Einzelnen Beitrag anzeigen

NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Benachrichtigung wenn Prozess gestartet wurde

  Alt 3. Jun 2012, 02:39
Ich hab noch nie damit gearbeitet, habe aber durch stöbern in der C++ Docu den Code zusammen geschusstert. Du musst nur noch es nur noch in nem Thread auslagern, da er die Anwendung so auf eisleget und du hast deine Abfrage. Im Anhang die Interfaces Datei, die ich per Delphi erstellen gelassen hab, nur die die meisten müsste man umändern, damit man die Errorcodes zurückbekommt, aber beim Debuggen übernihmt das die VCL meistens von selbst. Die Funktionen für diesen Ablauf habe ich bereits umgeändert.
Die Eigenschaften musst du im String suchen. Es gibt auch eine Möglichkeit, sie über die Interfaces abzurufen, aber dies führte bei mir nur zu Fehlern. Kannst es ja mal versuchen, wenn du durchblickst xD
Hier der Code:
Delphi-Quellcode:
var hr : HRESULT;
    pLoc : ISWbemLocator;
    pSvc : ISWbemServices;
    pObj,pNewInsta : ISWbemObject;
    pEvent : ISWbemEventSource;
    Str : WideString;
begin
  //Haupt-Interface
  hr := CoCreateInstance(CLASS_SWbemLocator, nil,
        CLSCTX_INPROC_SERVER, IID_ISWbemLocator, pLoc);
  if FAILED(hr) then
  begin
    ShowMessage('Fehler');
    Exit
  end;
  //Basiert anscheinend auf IP/Domain, ob man da vielleicht Server-Prozzese abrufen kann? Glaub ich eher nicht.
  hr := pLoc.ConnectServer('localhost', '', '', '', '', 0, '',nil, pSvc);
  if FAILED(hr) then
  begin
    pLoc._Release;
    ShowMessage('Fehler');
    Exit;
  end;

  ShowMessage('Connected to WMI'); //Ab hier hast du Zugriff.
  //Der Erste Parameter ist die Abfrage, dies basiert sehr auf SQL, was auch in der Beschreibung von "WQL", wie es sich nennt, steht.
  //Du kannst sehr vieles abrufen, aber damit fragst du ab, wenn ein Prozzes gestartet wurde.
  //Bei mir hat es mit dem Windows Editor geklappt, und 0 % CPU Auslastung beim Warten xD
  hr := pSvc.ExecNotificationQuery('SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE targetInstance ISA "Win32_Process"',
        'WQL',
        $00000020 or $00000010,
        nil,
        pEvent);

  if FAILED(hr) then
  begin
    pLoc._Release;
    pSvc._Release;
    ShowMessage('Fehler bei Query');
    Exit;
  end;
  //Hier die Schleife, nach NextEvent, wartet das Programm auf einen Prozzes start.
  while True do
  hr := pEvent.NextEvent(wbemTimeoutInfinite,pNewInsta);
  //pNewInsta ist nun der neue Prozzes, womit du nun alle Infos abfragen kannst
  if FAILED(hr) then
  begin
    pLoc._Release;
    pSvc._Release;
    pEvent._Release;
    ShowMessage('Fehler bei Instance');
    Exit;
  end;
  //Lass dir es mal in nem Memo ausgeben, da siehste, das sogut
  //wie alles in einem Klartext steht, in einer Art C++ Class Format.
  //Die ist aber sehr leicht zuverstehen finde ich.
  //Sollte für deine Zwecke reichen
  Str := pNewInsta.GetObjectText_(0); //Ist am einfachsten.
  //...bis hier hin.
Angehängte Dateien
Dateityp: pas WbemScripting_TLB.pas (96,8 KB, 13x aufgerufen)
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat