2013-06-01 4 views
-3
unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs,Tlhelp32, StdCtrls; 

    function processExists(exeFileName: string): Boolean; 
var 
    ContinueLoop: BOOL; 
    FSnapshotHandle: THandle; 
    FProcessEntry32: TProcessEntry32; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
    Result := False; 
    while Integer(ContinueLoop) <> 0 do 
    begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = 
     UpperCase(ExeFileName))) then 
    begin 
     Result := True; 
    end; 
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
    end; 
    CloseHandle(FSnapshotHandle); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if processExists('notepad.exe') then 
    ShowMessage('process is running') 
    else 
    ShowMessage('process not running'); 
end; 

enprocedure TForm1.Button1Click(Sender: TObject); 
begin 

end; 

Это мой точный код, в котором я получаю ошибки, это пример из трюков delphi. теперь я просто пытаюсь заполнить мое редактирование, так что stackoverflow позволит мне опубликовать мое редактирование, я, по-видимому, имею в основном код, поэтому мне нужно вежливо добавить более подробно.Определите, активен ли процесс

+0

«Я все время получаю ошибки» Какие ошибки? На какой строке кода. Возможно, отредактируйте свой вопрос и вставьте в него свой точный код. –

+0

Вы пытались вызвать «EnumProcesses»? –

+0

Позвонить enumProcesses? позвольте мне прочитать его снова, и я также опубликую сообщение об ошибке – Sheep

ответ

5

код в ваш вопрос не удается, потому что вы сумели скопировать содержимое функции processExists в FormCreate вместо самой фактической функции.

удалить код из FormCreate и реализовать функцию processExists в секции реализации:

function processExists(exeFileName : string) : Boolean; 
begin 
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
    Result := False; 
    while Integer(ContinueLoop) <> 0 do 
    begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = 
     UpperCase(ExeFileName))) then 
    begin 
     Result := True; 
    end; 
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
    end; 
    CloseHandle(FSnapshotHandle); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if processExists('notepad.exe') then 
    ShowMessage('process is running') 
    else 
    ShowMessage('process not running'); 
end; 
+0

Большое вам спасибо, он отлично поработал! wow теперь я должен прочитать это и все выяснить, я не думал о секциях реализации ... Мне нужно больше изучить разделы – Sheep

+2

@ Шейп, да, вы можете это сделать. Выберите код, который у вас есть в методе Button1Click, и переместите или скопируйте его в метод (FormCreate), связанный с событием OnCreate, тогда тот же код будет срабатывать при создании формы. Я также предлагаю вам взглянуть на ответ Дэвида, хотя и не на вопрос, он поднимает некоторые действительные моменты в отношении кода. – Peter

+0

@ PeterVonča Я не уверен, что мой ответ «не на месте». На самом деле я не вижу прямого вопроса. Код в вопросе даже не компилируется. Я просто обеспечил достойную реализацию «ProcessExists», которая устраняет множество проблем. –

1

Код, показанный на связанной странице, содержит ToolHelp API из Windows. Вы должны посмотреть на связанную страницу.

Когда вы используете этот API, вы создаете моментальный снимок списка текущих процессов ОС и используете Process32First и Process32Next, чтобы пройти через этот список, чтобы обнаружить этот процесс.

Предложение: часть MadKernel от MadCollection (MadExcept и MadCodeHook - платные части) делает очень приятную и полезную оболочку вокруг этих функций. Эти вызовы заставили мою 50-строчную функцию отправить сообщение в родительское приложение на 10-строчный.

PS: Я не имею никакого отношения к madshi.net, кроме использования их ЛИЭС ;-)

+0

Вы имеете в виду Tlhelp32 Sheep

+0

Кроме того, это будет работать отлично для меня .. но он будет получать приложения только внутри delphi, я хочу, чтобы он делал это во внешних приложениях – Sheep

3

код оказывается в неправильном месте. Мы не можем видеть вашу реализацию ProcessExists, но здесь должен жить код.

Но я хочу сосредоточиться на коде в вопросе, который содержит несколько ошибок. Вот как я бы писать:

function ProcessExists(const ExeFileName: string): Boolean; 
var 
    SnapshotHandle: THandle; 
    ProcessEntry32: TProcessEntry32; 
    Continue: BOOL; 
begin 
    Result := False; 
    SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    Win32Check(SnapshotHandle<>INVALID_HANDLE_VALUE); 
    try 
    ProcessEntry32.dwSize := SizeOf(ProcessEntry32); 
    Continue := Process32First(SnapshotHandle, ProcessEntry32); 
    while Continue do 
    begin 
     if SameText(ProcessEntry32.szExeFile, ExeFileName) then 
     begin 
     Result := True; 
     exit; 
     end; 
     Continue := Process32Next(SnapshotHandle, ProcessEntry32); 
    end; 
    finally 
    CloseHandle(SnapshotHandle); 
    end; 
end; 

Проблемы, с которыми я обратился:

  1. Не использовать глобальные переменные здесь. Здесь переменные могут быть и должны быть локальными переменными. Используйте локальные переменные по всем другим переменным и используйте их везде, где это возможно.
  2. Не накладывайте BOOL на целое число и сравнивайте его с 0. A BOOL является логическим и поэтому может использоваться непосредственно в логическом контексте.
  3. Используйте SameText, а не то, что UpperCase беспорядок.
  4. Не повторяйте одно и то же сравнение текста дважды. Достаточно один раз.
  5. Выйдите из цикла, когда найдете совпадение.
  6. Используйте try/finally для защиты от исключений, ведущих к утечке ресурсов.
Смежные вопросы