Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2008, 04:15   #1
subsonic
Пользователь
 
Регистрация: 03.01.2008
Сообщений: 48
По умолчанию Узнать работает ли процесс.

как узнать запущена-ли программа?
subsonic вне форума Ответить с цитированием
Старый 10.06.2008, 05:10   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Надеюсь я правильно все понял, раз в заголовке фигурировало слово "процессы"...

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
TProcessEntry32 = packed record
  dwSize:              DWORD;
  cntUsage:            DWORD;
  th32ProcessID:       DWORD;
  th32DefaultHeapID:   DWORD;
  th32ModuleID:        DWORD;
  cntThreads:          DWORD;
  th32ParentProcessID: DWORD;
  pcPriClassBase:      LongInt;
  dwFlags:             DWORD;
  szExeFile: array[0..MAX_PATH - 1] of WideChar;
end;

TCreateToolHelp32SnapShot = function(dwFlag, th32ProcessID: DWORD): THandle; stdcall;

TProcess32First = function(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL; stdcall;

TProcess32Next = function(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL; stdcall;



type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
  hKernel: THandle;
  CreateToolHelp32SnapShot: TCreateToolHelp32SnapShot;
  Process32First: TProcess32First;
  Process32Next: TProcess32Next;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
hKernel := LoadLibrary('kernel32.dll');
@CreateToolHelp32Snapshot := GetProcAddress(hKernel, 'CreateToolhelp32Snapshot');
@Process32First := GetProcAddress(hKernel, 'Process32FirstW');
@Process32Next := GetProcAddress(hKernel, 'Process32NextW');

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ProcessEntry: TProcessEntry32;
  hProcessSnap: THandle;
begin
FillChar(ProcessEntry, SizeOf(TProcessEntry32), #0);
ProcessEntry.dwSize := SizeOf(TProcessEntry32);
hProcessSnap := CreateToolHelp32Snapshot($2, 0);

if not Process32First(hProcessSnap, ProcessEntry) then Exit;
repeat
Memo1.Lines.Add(string(ProcessEntry.szExeFile));
until not Process32Next(hProcessSnap, ProcessEntry);
end;

end.
Баламут вне форума Ответить с цитированием
Старый 10.06.2008, 05:19   #3
subsonic
Пользователь
 
Регистрация: 03.01.2008
Сообщений: 48
По умолчанию

Короче, программа должна смотреть, запущена-ли прога?
если нет, то запускать.
subsonic вне форума Ответить с цитированием
Старый 10.06.2008, 05:53   #4
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Ну так посмотри исходник-то! Зря я его выкладывал что ли?
Баламут вне форума Ответить с цитированием
Старый 10.06.2008, 10:03   #5
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Это конечно не по процессам, но тоже неплохой вариант.(если заголовок программы остаётся неизменным)

Код:
Uses 
    ShellApi, ...

procedure TForm1.Timer1Timer(Sender: TObject);
Var
H:HWND;
Begin
H:=FindWindow(Nil, 'Заголовок программы');
If H<>0 Then
Exit;
ShellExecute(Application.Handle, 'Open', 'C:\1.exe' ,Nil, Nil, SW_SHOWDEFAULT);
End;
Всегда рад помочь!

Последний раз редактировалось Stilet; 16.04.2009 в 16:14.
Terran вне форума Ответить с цитированием
Старый 10.06.2008, 19:06   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

есть другой вариант: если файл экзешника открывается с полным доступом, значит он не занят, следовательно программа не запущена. Отсюда этот код:
Код:
procedure RunIfNotPresent(FN:String);
var
  _H:THandle;
begin
  _H:=CreateFile(pchar(FN),GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
  if _H<>INVALID_HANDLE_VALUE then
   begin
    CloseHandle(_H);
    WinExec(pchar(FN),SW_SHOWNORMAL);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
  RunIfNotPresent('F:\1.exe');
end;
rpy3uH вне форума Ответить с цитированием
Старый 15.04.2009, 20:40   #7
cowboy
Форумчанин
 
Регистрация: 12.03.2009
Сообщений: 109
По умолчанию

Помогите пожалуста немного разобраться с процессами...
БУдет несколько вопросов... Вот процедура небольшая которая помогает получить список процессов, и записать их в стринглист..

Код:
procedure CreateWinNTProcessList(List: TstringList);
var
  PIDArray: array [0..1023] of DWORD;
  cb: DWORD;
  I: Integer;
  ProcCount: Integer;
  hMod: HMODULE;
  hProcess: THandle;
  ModuleName: array [0..300] of Char;
begin
  if List = nil then Exit;
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess);
    end;
  end;
end;
Вопросы:
1.EnumProcesses,EnumProcesses-что это за функции?
cowboy вне форума Ответить с цитированием
Старый 16.04.2009, 16:17   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
EnumProcesses,EnumProcesses-что это за функции?
Функции которые прописаны в том модуле откуда ты код выдернул, или в связанных с ним модулях.

Де ты вообще этот код достал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.04.2009, 18:02   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
uses TLHELP32;

---------------------------

function CheckByEXEName(EXEName:string):boolean; 
var
 Co:BOOL;
 FS:THandle;
 FP:TProcessEntry32;
begin
 FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 FP.dwSize := Sizeof(FP);
 Co:=Process32First(FS,FP);
 Result:=false;
 while (integer(Co)<>0)and(Result=false) do
  begin
   if ANSIUpperCase(FP.szExeFile)=ANSIUpperCase(EXEName) then Result:=true;
   Co:=Process32Next(FS,FP);
  end;
 CloseHandle(FS);
end;
если я правильно понял твой вопрос, и не мучайся.
кстати поиск тоже не отменяли
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.04.2009, 18:20   #10
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,455
По умолчанию

Вот! Держи...

Не забуть добавить модуль в uses TLHelp32;

Код:
function IsRunning(sName: string): boolean;
var
  han: THandle;
  ProcStruct: PROCESSENTRY32;
  sID: string;
begin
  Result := false;
  han := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if han = 0 then
    exit;
  ProcStruct.dwSize := sizeof(PROCESSENTRY32);
  if Process32First(han, ProcStruct) then
  begin
  repeat
  sID := ExtractFileName(ProcStruct.szExeFile);
  if uppercase(copy(sId, 1, length(sName))) = uppercase(sName) then
  begin
  Result := true;
  Break;
  end;
  until not Process32Next(han, ProcStruct);
  end;
  CloseHandle(han);
end;
Применение:

Код:
if IsRunning('delphi32.exe') = true then
ShowMessage('Делфи запущена') else ShowMessage('Делфи не запущена');
Помог? если да, то нажмите на весы с лева =)
uberchel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать - запущен ли определенный процесс ? 12usver12 Общие вопросы Delphi 16 21.02.2011 02:52
Узнать под каким пользователем работает процесс sysyman Win Api 2 10.02.2009 00:10
Проблема с UserForm. То работает, то НЕ работает Maxx Microsoft Office Excel 6 19.11.2008 14:51
Как узнать с какого по какой адрес занимает процесс в системе. kalexi Win Api 2 30.03.2008 15:48
Как узнать,нужен ли мне определённый процесс Alximik Софт 5 21.11.2007 13:50