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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2015, 18:43   #1
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
Лампочка Вывод времени создания исполняемого файла процесса в StringGrid (Delphi)

Здравствуйте! Пытаюсь сделать программу коротая бы выводила информацию о процессах в таблицу.
Всего там 4 столбца:
1) Имя процесса
2) PID
3) Время создания
4) Путь

Для этого я подключил модуль Thelp32, и всё кроме времени создания(создания exe файла процесса) у меня получилось вывести.
Пробовал найти похожие программы, чтоб позаимствовать функцию, но не нашел. Если кто знает как это реализовать то я буду безмерно благодарен.



Код:
procedure TForm1.processinfotogrid(procinfogrid:TStringGrid);  //заполнение таблицы
var  hsnap: Thandle;
        procentry:  TProcessEntry32;
        k:byte;
 
begin
k:=1;
hsnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
procentry.dwSize:=sizeof(procentry);
Process32First(hsnap,procentry);
repeat
with procinfogrid do
 begin
  if k>rowcount-1 then
  rowcount:=rowcount+1;
  cells[0,k]:=procentry.szexefile;                               //имя процесса
  cells[1,k]:=inttostr(procentry.th32ProcessID);                 // ProcessID
  cells[3,k]:=pp(procentry.th32processid)+procentry.szexefile;   //путь к файлу
  cells[2,k]:=                                                  //тут будет время
 end;
k:=k+1;
until Process32Next(hsnap,procentry)<>true;
if k<procinfogrid.RowCount then procinfogrid.RowCount:=k;
CloseHandle(hsnap);
end;
Заранее спасибо.
delboske вне форума Ответить с цитированием
Старый 19.05.2015, 22:41   #2
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

GetProcessTimes
ДралсяСошибками вне форума Ответить с цитированием
Старый 20.05.2015, 13:14   #3
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

ДралсяСошибками

Если не затруднит, можно по подробней описать функцию. А то у меня с ней туго. Я нашел реализацию такого типа. Но не знаю как её к виду функции перевести.

Код:
Procedure  GetAllProcessTime;
var
  HandleSnapShot   : THandle;
  EntryParentProc  : TProcessEntry32;
  DummyCreateFileTime : Windows.FILETIME;
  DummyExitFileTime   : Windows.FILETIME;
  DummyKernelFileTime : Windows.FILETIME;
  DummyUserFileTime   : Windows.FILETIME;
  aFileName           : String;
  h                   : THandle;
  ActualTime          : TDateTime;
  Dif                 : TDateTime;
  CreationTime        : TDateTime;


function FileTime2DateTime(FileTime: TFileTime): TDateTime;    //Convert then FileTime to TDatetime format
var
  LocalTime: TFileTime;
  DOSTime  : Integer;
begin
  FileTimeToLocalFileTime(FileTime, LocalTime);
  FileTimeToDosDateTime(LocalTime, LongRec(DOSTime).Hi, LongRec(DOSTime).Lo);
  Result := FileDateToDateTime(DOSTime);
end;

begin
  HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  //get the list of process
  if HandleSnapShot <> INVALID_HANDLE_VALUE then
  begin
    EntryParentProc.dwSize := SizeOf(EntryParentProc);
    if Process32First(HandleSnapShot, EntryParentProc) then   //Get the first process in the list
    begin
      Writeln( Format('%-30s %-20s %-16s',['FileName','Start','Running Time'])  );
      ActualTime:=Now;
      repeat
          h:=OpenProcess(PROCESS_QUERY_INFORMATION,false,EntryParentProc.th32ProcessID);  //open a particular process
          if GetProcessTimes(h, DummyCreateFileTime, DummyExitFileTime, DummyKernelFileTime, DummyUserFileTime) then  //get the timing  info
          begin
            aFileName:=ExtractFileName(EntryParentProc.szExeFile);
            CreationTime:=FileTime2DateTime(DummyCreateFileTime); //get the initial time of the process
            Dif :=  ActualTime-CreationTime; //calculate the elapsed time
            Writeln( Format('%-30s %-20s %-16s',[aFileName,FormatDateTime('DD-MM-YYYY HH:NN:SS',CreationTime),FormatDateTime('HH:NN:SS',Dif)])  );
          end;
          CloseHandle(h);
      until not Process32Next(HandleSnapShot, EntryParentProc);
    end;
    CloseHandle(HandleSnapShot);
  end;

end;



begin
  try
    GetAllProcessTime();
    Readln;
  except
    on E: Exception do
    begin
     Writeln(E.ClassName, ': ', E.Message);
     Readln;
    end;
  end;
end.
delboske вне форума Ответить с цитированием
Старый 20.05.2015, 13:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
Procedure  GetAllProcessTime(g:TStringGrid);
var
  HandleSnapShot   : THandle;
  EntryParentProc  : TProcessEntry32;
  DummyCreateFileTime : Windows.FILETIME;
  DummyExitFileTime   : Windows.FILETIME;
  DummyKernelFileTime : Windows.FILETIME;
  DummyUserFileTime   : Windows.FILETIME;
  aFileName           : String;
  h                   : THandle;
  ActualTime          : TDateTime;
  Dif                 : TDateTime;
  CreationTime        : TDateTime;


function FileTime2DateTime(FileTime: TFileTime): TDateTime;    //Convert then FileTime to TDatetime format
var
  LocalTime: TFileTime;
  DOSTime  : Integer;
begin
  FileTimeToLocalFileTime(FileTime, LocalTime);
  FileTimeToDosDateTime(LocalTime, LongRec(DOSTime).Hi, LongRec(DOSTime).Lo);
  Result := FileDateToDateTime(DOSTime);
end;

begin
  g.Rowcount:=1;
  HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  //get the list of process
  if HandleSnapShot <> INVALID_HANDLE_VALUE then
  begin
    EntryParentProc.dwSize := SizeOf(EntryParentProc);
    if Process32First(HandleSnapShot, EntryParentProc) then   //Get the first process in the list
    begin
      g.Rowcount:=g.Rowcount+1;
      g.cells[0,g.Rowcount-1]:=( Format('%-30s %-20s %-16s',['FileName','Start','Running Time'])  );
      ActualTime:=Now;
      repeat
          h:=OpenProcess(PROCESS_QUERY_INFORMATION,false,EntryParentProc.th32ProcessID);  //open a particular process
          if GetProcessTimes(h, DummyCreateFileTime, DummyExitFileTime, DummyKernelFileTime, DummyUserFileTime) then  //get the timing  info
          begin
            aFileName:=ExtractFileName(EntryParentProc.szExeFile);
            CreationTime:=FileTime2DateTime(DummyCreateFileTime); //get the initial time of the process
            Dif :=  ActualTime-CreationTime; //calculate the elapsed time
            g.Rowcount:=g.Rowcount+1;
            g.cells[0,g.Rowcount-1]:=( Format('%-30s %-20s %-16s',[aFileName,FormatDateTime('DD-MM-YYYY HH:NN:SS',CreationTime),FormatDateTime('HH:NN:SS',Dif)])  );
          end;
          CloseHandle(h);
      until not Process32Next(HandleSnapShot, EntryParentProc);
    end;
    CloseHandle(HandleSnapShot);
  end;

end;
Соответственно GetAllProcessTime(StringGrid);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.05.2015, 13:55   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ТС интересует не время процесса как такового, а
Цитата:
времени создания(создания exe файла
время создания соответствующего exe файла.

у тебя уже есть файл
Цитата:
Код:
cells[3,k]:=pp(procentry.th32processid)+procentry.szexefile;   //путь к файлу
Код:
r:=FileAge({cells[3,k] или еще как-то }); //получить время файла по его имени
t:=FileDateToDateTime(r); //перевести время файла из одного формата(OS timestamp) в другой (TDateTime)
cells[4,k]:=FomatDateTime('DD.MM.YYYY hh:mm:ss', t); //перевести время в символьное представление
ну и конечно же нужны переменные
Код:
var
   r: integer;
   t: TdateTime;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.05.2015 в 14:01.
evg_m вне форума Ответить с цитированием
Старый 20.05.2015, 14:39   #6
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

Спасибо! Программа компилируется, но при запуске выдает:
"Проект Project1.exe вызвал исключение класса EConvertError с сообщением ''Invalid argument to data encode".
delboske вне форума Ответить с цитированием
Старый 20.05.2015, 15:01   #7
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Видимо проблема в функции: FileTime2DateTime
Замени её на:
Код:
function FileTime2DateTime(FileTime: TFileTime): TDateTime;
var
  ModifiedTime: TFileTime;
  SystemTime: TSystemTime;
begin
  FileTimeToLocalFileTime(FileTime, ModifiedTime);
  FileTimeToSystemTime(ModifiedTime, SystemTime);
  Result := SystemTimeToDateTime(SystemTime);
end;
А путь к процессу, красивей, тянуть из TModuleEntry32
ДралсяСошибками вне форума Ответить с цитированием
Старый 20.05.2015, 15:45   #8
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

ДралсяСошибками Это я про код evg_m писал , он прав на счет того, что мне нужно именно время создания exe файла.

Цитата:
Сообщение от ДралсяСошибками Посмотреть сообщение
А путь к процессу, красивей, тянуть из TModuleEntry32
Сейчас попробую через него путь достать.
delboske вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод матрицы из файла в StringGrid Heng Помощь студентам 1 29.09.2012 13:30
вывод имени файла(исполняемого)в cmd molan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 24.03.2012 09:36
Вывод текстового файла в Stringgrid KingWaR56 Помощь студентам 1 26.04.2011 18:39
cmd массив с изменением времени создания файла. Ast Помощь студентам 3 09.02.2011 14:07
Способы уменьшения исполняемого файла в Delphi 2010 STRELOK-2007 Общие вопросы Delphi 3 23.06.2010 12:23