Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
Delphi 2009 Professional
|
AW: Benachrichtigung wenn Prozess gestartet wurde
3. Jun 2012, 03: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.
Nickel "Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
|