Author Topic: Можно как-то получить список запущенных процессов в диспетчере задачь?  (Read 10787 times)

0 Members and 1 Guest are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
вот так будет выглядеть передача строки в длл:
Code: (clickermann) [Select]
$name = "process.exe"


//создаем массив
FOR($a=0, $a < 15)  //максимальная длина имени процесса
    $arr_code[$a] = 0
END_CYC


//пишем строку в массив (коды символов)
FOR($a=1, $a <= STRLEN ($name))
   $arr_code[$a-1] = code(STRCUT($name, $a, 1)))
END_CYC

CALL ("check_process.dll", STRLEN($name), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])


//в длл берем столько параметров, сколько указанно в первом параметре (длина строки), и создаем там саму строку имени процесса.
halt
Ты можешь намутить эту длл-ку? Ато я сейчас колупаться буду до утра...
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Я чего-то обнаглел сегодня... ::) Я просто с 5-ти утра с этими скриптами вожусь - голова уже не варит...
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
вот так будет выглядеть передача строки в длл:
Code: (clickermann) [Select]
$name = "process.exe"


//создаем массив
FOR($a=0, $a < 15)  //максимальная длина имени процесса
    $arr_code[$a] = 0
END_CYC


//пишем строку в массив (коды символов)
FOR($a=1, $a <= STRLEN ($name))
   $arr_code[$a-1] = code(STRCUT($name, $a, 1)))
END_CYC

CALL ("check_process.dll", STRLEN($name), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])


//в длл берем столько параметров, сколько указанно в первом параметре (длина строки), и создаем там саму строку имени процесса.
halt
Ты можешь намутить эту длл-ку? Ато я сейчас колупаться буду до утра...

 ;D Не, сорри, но я тоже не полон сил сегодня. Максимум на что есть вдохновение, это попробовать принять эти параметры и создать из них строку. А с остальным - это придется много искать, читать, вникать. Такчто.... ВСЯ НАДЕЖДА НА ТЕБЯ  :D

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Максимум на что есть вдохновение, это попробовать принять эти параметры и создать из них строку.
Я буду благодарен )) Именно это мне и нужно ))
А с остальным - это придется много искать, читать, вникать.
Если что... - http://crapware.aidf.org/forum/index.php?topic=4097.msg27886#msg27886
Ты в свое время уже нашел, прочитал и вник  ;D ;D ;D
« Last Edit: March 02, 2019, 12:09:13 AM by Hito »
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile

 ;D Не, сорри, но я тоже не полон сил сегодня. Максимум на что есть вдохновение, это попробовать принять эти параметры и создать из них строку.

Как и обещал, на что вдохновения хватило. Передаем строку в длл из кликермана, а в длл принимаем и присваиваем переменной process_name:


Код для делфи (длл)
Code: (clickermann) [Select]
library test;

uses
  Vcl.Dialogs,
  SysUtils;

function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;

var
  process_name: String;
  i: Integer;

begin

  //собираем строку
 for i:= 1 to pIntArr(_mas^)[0] do
 begin
  Insert(Char(pIntArr(_mas^)[i]), process_name, i) ;
 end;

 ShowMessage(process_name);  //  process_name - наша строка, которую передал кликерман

 result := 1; //не важно

end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;
begin
  // тело пусто
end.


Передаем кликерманом массив из кодов символов:
Code: (clickermann) [Select]
$name = "process.exe"
 
 
//создаем массив
FOR($a=0, $a < 15)  //максимальная длина имени процесса
    $arr_code[$a] = 0
END_CYC
 
 
//пишем строку в массив (коды символов)
FOR($a=1, $a <= STRLEN ($name))
   $arr_code[$a-1] = code(STRCUT($name, $a, 1))
END_CYC
 
CALL ("cmann_plugin.dll", STRLEN($name), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])
 
//print($_return1)
halt




А вот с наличием этого процесса, это ты уж сам, или может завтра посмотрю, поищу, что там да как.

 :o длл-ка вышла в 2 с лишним мегабайта, во вложение не влазит. Изза Vcl.Dialogs модуля наверно. Незнаю, молжет альтернатива есть какая? В делфи 7 был просто "Dialogs" , в делфи 10 уже не прокатывает.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Это ж ShowMessage(process_name); . Это длл нам показала что записано в переменной process_name . Так, для уверенности,  что все получилось правильно :D

Во вложении архив с длл.
« Last Edit: March 02, 2019, 01:18:39 AM by dramster »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Это ж ShowMessage(process_name); . Это длл нам показала что записано в переменной process_name . Так для уверенности  что все получилось правильно :D

Во вложении архив с длл.
Ну, спасибо большое! )))) В остальном думаю, что разберусь тут )) - http://www.cyberforum.ru/delphi-beginners/thread628578.html
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Это ж ShowMessage(process_name); . Это длл нам показала что записано в переменной process_name . Так, для уверенности,  что все получилось правильно :D

Во вложении архив с длл.
Точно... Я что-то "ShowMessage(process_name);" упустил из вида...)
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Если кому понадобится...

Код в кликере:
Code: (clickermann) [Select]
// Подпрограмма - прописываем ее один раз в начале скрипта
SUB(check_process, $name_process, $max_num_lett)
   //создаем массив
   FOR($a=0, $a < $max_num_lett)  //максимальная длина имени процесса
      $arr_code[$a] = 0
   END_CYC
   //пишем строку в массив (коды символов)
   FOR($a=1, $a <= STRLEN ($name_process))
      $arr_code[$a-1] = code(STRCUT($name_process, $a, 1))
   END_CYC
   
   CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])
   
   UNDEFINE ($arr_code)
END_SUB

// Вызываем подпрограмму каждый раз, когда нам нужно чекнуть процесс
check_process ("explorer.exe", 12)
IF($_return1)
   LOGWRITE ("Процесс присутствует")
else
   LOGWRITE ("Процесс не найден")
END_IF

halt

Исходник dll (чисто информация для программистов на delphi):
Code: (clickermann) [Select]
library check_process;

uses
    System.SysUtils, System.Classes, Winapi.Windows, TlHelp32;

function processExists(exeFileName: string): Boolean;
var
    ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
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;

function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
    pIntArr = array[0..0] of Integer;

var
    process_name: String;
    i: Integer;

begin
    //собираем строку
    for i:= 1 to pIntArr(_mas^)[0] do
    begin
        Insert(Char(pIntArr(_mas^)[i]), process_name, i) ;
    end;
    // Проверяем наличие процесса
    If ProcessExists(process_name) Then result := 1 Else result := 0
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

{$R *.res}

begin
end.

dll-ка https://yadi.sk/d/MOnRtFRr_t4xRg
« Last Edit: March 02, 2019, 02:28:25 PM by Hito »
Я не ду... Потому и не бу...

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
можно еще один костыль приписать пока 4.14 в релиз не вышла)

Code: (clickermann) [Select]
$code_a = 65
$code_b = 66
$code_c = 67
// ...

$str = "abc"

FOR($i = 0, $i < STRLEN($str))
   $arr[$i] = GETVAR(STRCONCAT("$code_", STRCUT($str, $i+1, 1)))
   PRINT($arr[$i])
END_CYC

HALT
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Если кому понадобится...

Код в кликере:
Code: (clickermann) [Select]
// Подпрограмма - прописываем ее один раз в начале скрипта
SUB(check_process, $name_process, $max_num_lett)
   //создаем массив
   FOR($a=0, $a < $max_num_lett)  //максимальная длина имени процесса
      $arr_code[$a] = 0
   END_CYC
   //пишем строку в массив (коды символов)
   FOR($a=1, $a <= STRLEN ($name_process))
      $arr_code[$a-1] = code(STRCUT($name_process, $a, 1))
   END_CYC
   
   CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])
   
   UNDEFINE ($arr_code)
END_SUB

// Вызываем подпрограмму каждый раз, когда нам нужно чекнуть процесс
check_process ("explorer.exe", 12)

halt

А так работает? Когда у тебя в check_process ("explorer.exe", 12) параметр максимальной длины =12, а при вызове длл используются элементы массива до 14, должна была вылезти ошибка не существующего элемента(ов). Если ошибки нету, то и создавать массив нет надобности. Можно обойтись вот таким вариантом:
Code: (clickermann) [Select]
SUB(check_process, $name_process)

   //пишем строку в массив (коды символов)
   FOR($a=1, $a <= STRLEN ($name_process))
      $arr_code[$a-1] = code(STRCUT($name_process, $a, 1))
   END_CYC
   
   //если имя процесса будет длинее 15-ти символов, то нужно добавить в вызов еще параметров столько, сколько требуется, с запасом.
   CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])
   
END_SUB

// Вызываем подпрограмму каждый раз, когда нам нужно чекнуть процесс
check_process ("explorer.exe")

И UNDEFINE ($arr_code) тоже будет тратить драгоценные силы и время, убираем, лишнее.

Так и как? Получилось что требовалось? Самому тестить не охота.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
При строке - FOR($a=1, $a <= STRLEN ($name_process))
выдает ошибку в строке - CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])

Я тоже так хотел, но... :(
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
При строке - FOR($a=1, $a <= STRLEN ($name_process))
выдает ошибку в строке - CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])


Чтото я запутался  :( . Можно еще раз? Но немного поподробнее.


И да, я проверил, создавать массив нужно обязательно, иначе ошибка. Но вот почему в твоем варианте с параметром макс. длины небыло ошибки? Создавался же массив в 12 элементов, а при вызове длл использовались уже 15.

Правильно будет не использовать этот параметр длины, а вписать его статичным числом, и такое же число параметров прописать в вызов длл.
А еще лучше, выполнить создание массива один раз при старте скрипта, и больше не повторять.
Вот так:

Code: (clickermann) [Select]
SUB(check_process, $name_process)
   //создаем массив, один раз
   IF($cr = 0)
      FOR($a=0, $a < 15)  //максимальная длина имени процесса
         $arr_code[$a] = 0
      END_CYC
      $cr = 1
   END_IF   
   
   //пишем строку в массив (коды символов)
   FOR($a=1, $a <= STRLEN ($name_process))
      $arr_code[$a-1] = code(STRCUT($name_process, $a, 1))
   END_CYC
   
   CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14])
     
END_SUB

// Вызываем подпрограмму каждый раз, когда нам нужно чекнуть процесс
check_process ("explorer.exe")


halt



Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Создавался же массив в 12 элементов, а при вызове длл использовались уже 15.
;D Работает и работает... Видимо главное, чтобы не больше 15 символов было, или увеличивать тогда в строке:

CALL ("check_process.dll", STRLEN($name_process), $arr_code[0], $arr_code[1], $arr_code[2], $arr_code[3], $arr_code[4], $arr_code[5], $arr_code[6], $arr_code[7], $arr_code[8], $arr_code[9], $arr_code[10], $arr_code[11], $arr_code[12], $arr_code[13], $arr_code[14],$arr_code[15],$arr_code[16],$arr_code[17])... И так далее...
Я не ду... Потому и не бу...