Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (2): [1] 2 »   

> Описание: Обмен данными по Pipe каналу
Kibor
Отправлено: 26 Января, 2021 - 15:50:45
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Данные функции позволяют запускать приложения и обмениваться с ними данными по Pipe каналу.

createpipeprocess - запускает процесс и создает Pipe канал.
Функция может вызываться с разным количеством параметров.
Короткая:
CODE:
createpipeprocess("C:\Windows\System32\cmd.exe -i");

В виде параметра принимает командную строку пути к программе.
Длинная:
CODE:
createpipeprocess("C:\Windows\System32\cmd.exe -i", STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES, SW_HIDE);

Первый параметр - принимает командную строку пути к программе.
Второй - dwFlags структуры STARTUPINFO. В случае короткой функции этот параметр по умолчанию STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES
Третий - wShowWindow структуры STARTUPINFO. В случае короткой функции этот параметр по умолчанию SW_HIDE

Функция возвращает 1 при успехе.
-1 если канал не создан.
0 если не удалось запустить процесс.

======================================

sendpipe - отправляет данные процессу по Pipe
CODE:
sendpipe("dir^n");//Отправить dir и ентер

В виде параметра принимает строку.

Функция возвращает 1 при успехе.

======================================

waitpipe - ожидает пока в канале не появятся данные для чтения.
Функция выходит из ожидания при появление первых данных. Не ожидает окончания когда все данные будут готовы для чтения.
CODE:
waitpipe();

Возвращает количество байт готовых для чтения. Может отличаться от количества которые можно будут прочитать по окончанию обработки введенной команды процессом.

======================================

getpipe - считывает данные с Pipe канала.
Функция может вызываться с разными параметрами.

1)
Параметр - указатель на string в который запишутся читаемые данные
CODE:
string S;
int C=getpipe(#S);


2)
Параметр - указатель на массив char в который запишутся читаемые данные
CODE:
char G[1000000];
int C=getpipe(#G[0]);

Надо объявлять массив на 1 больше чем ожидаемые данные. Последний элемент заполнится 0

3)
Параметр первый - указатель на массив char в который запишутся читаемые данные
Второй - количество читаемых байт. Остальные останутся несчитанными.
CODE:
char G[11];
int C=getpipe(#G[0], 10);

Надо объявлять массив на 1 больше чем ожидаемые данные. Последний элемент заполнится 0

Функция возвращает количество считанных в этом вызове байт.
-1 при ошибке.

Если количество считанных байт равно 0, это означает что все байты считанные уже или процесс еще не успел выдать данные и надо немного подождать что бы считать.


======================================

closepipeprocess - завершает процесс и закрывает канал.

CODE:
closepipeprocess();




Примеры:

Правильное чтение ВСЕГО ответа
CODE:
if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
sendpipe("chcp 1251^n");//Устанавливаем кодировку windows 1251 для русс шрифта
sendpipe("dir^n");//Отправляем команду dir
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
string rez="";
char G[9999999];
while (getpipe(#G[0], size(#G[0]))) rez=rez+format(#G[0]);//Считываем весь ответ пока он идет
messagebox (rez);
closepipeprocess();//Завершим процесс и закрываем канал
}



CODE:
if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
sendpipe("chcp 1251^n");//Устанавливаем кодировку windows 1251 для русс шрифта
sendpipe("dir^n");//Отправляем команду dir
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
int C;
string S;
C=getpipe(#S);//Читаем
messagebox (C);
messagebox (S);

closepipeprocess();//Завершим процесс и закрываем канал
}


===========

CODE:
if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
sendpipe("chcp 1251^n");//Устанавливаем кодировку windows 1251 для русс шрифта
sendpipe("dir^n");//Отправляем команду dir
waitpipe();

char G[1000000];
int C;
int n=0;
A: looptime(3000)//Считываем в течение 3 секунд
{
C=getpipe(#G[n]);
n=n+C;
if (C!=0) goto A;
}
C=n;
messagebox (C);
messagebox (format(#G[0]));

closepipeprocess();//Завершим процесс и закрываем канал
}


===========

CODE:
if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
sendpipe("chcp 1251^n");//Устанавливаем кодировку windows 1251 для русс шрифта
sendpipe("dir^n");//Отправляем команду dir
waitpipe();

char G[11];

int C=getpipe(#G[0], 10);

messagebox (C);
messagebox (format(#G[0]));

closepipeprocess();//Завершим процесс и закрываем канал
}
 
 Top
Kibor
Отправлено: 27 Января, 2021 - 15:47:23
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Если в выводе из cmd вместо русс текста кракозябры - устанавливаем кодировку windows 1251 для русс шрифта
CODE:
sendpipe("chcp 1251^n");//Устанавливаем кодировку windows 1251 для русс шрифта


CODE:
if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
int C;
string S;

//Если не хотим что бы приветстие было в выводе считаем его из канала
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
getpipe(#S);//Читаем все с канала

sendpipe("chcp 1251^n");//Устанавливаем кодировку windows 1251 для русс шрифта

//Если не хотим что бы ответ на команду был в выводе считаем его из канала
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
getpipe(#S);//Читаем все с канала



sendpipe("help^n");//Отправляем команду help
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
C=getpipe(#S);//Читаем
messagebox (C);
messagebox (S);

closepipeprocess();//Завершим процесс и закрываем канал
}


Или использовать функцию d866tow1251 перекодирует текст из DOS 866 в WINDOWS 1251

CODE:
if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
int C;
string S;
sendpipe("help^n");//Отправляем команду help
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
C=getpipe(#S);//Читаем
messagebox (C);
messagebox (S);
S=d866tow1251 (S);//перекодирует текст из DOS 866 в WINDOWS 1251
messagebox (S);
closepipeprocess();//Завершим процесс и закрываем канал
}
 
 Top
Kibor
Отправлено: 27 Января, 2021 - 18:11:49
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Пример проверки пинга и вывода пинга на диалог ограниченное количество времени с выходом из режима пингования.

CODE:
int pos_size_static0[1][4];
string text_static0[1];

pos_size_static0[0][0]=9; pos_size_static0[0][1]=9; pos_size_static0[0][2]=398; pos_size_static0[0][3]=367;
text_static0[0]="";

//////////

createdialog(0, STATIC, #pos_size_static0[0][0], #text_static0[0]);
//////////

showdialog(0, "Диалог", 207, 109, 426, 422, 1, 1);
//////////

//loop() sleep(10);//Убрать после теста

if (createpipeprocess("C:\Windows\System32\cmd.exe -i"))
{
int C;
string S;
char G[1000000];
int n=0;
sendpipe("ping googl.com -t^n");//Отправляем команду ping googl.com -t
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
A: looptime(3000)//Считываем в течение 3 секунд
{
C=getpipe(#G[n]);
n=n+C;
text_static0[0]=d866tow1251 (format(#G[0]));
if (n>1000) break;
sleep(10);
if (C!=0) goto A;
}
messagebox ("Завершено");
closepipeprocess();//Завершим процесс и закрываем канал
}
 
 Top
lps
Отправлено: 14 Июля, 2022 - 10:12:18
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июнь 2021  
Репутация: 0




Я использую в скрипте pipe-процесс для запуска команды из powershell:
createpipeprocess("powershell.exe -NoLogo"Подмигивание
sendpipe( "Set-Clipboard (Get-Content ^"" + inp + "^" -Encoding utf8)^n"Подмигивание;
waitpipe();
pause( 1000 );
closepipeprocess();

На моем локальном компе (Windows 10) все работает безукоризненно.
При этом на сервере (Windows Server 2019) не работает:
- createpipeprocess(), sendpipe, waitpipe ошибку НЕ возвращают
- та же самая команда при запуске вручную из приложения powershell cрабатывает
- при запуске через Кибор->pipe команда не срабатывает

(команда должна копировать содержимое файла в буфер обмена)

Помогите пожалуйста, может у кого-то есть идеи почему там может быть?
 
 Top
Zireael
Отправлено: 14 Июля, 2022 - 10:59:59
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4397
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
createpipeprocess(), sendpipe, waitpipe ошибку НЕ возвращают

Что они возвращают?:
CODE:
int result = createpipeprocess("powershell.exe -NoLogo");
messagebox(result);

 Цитата:
Функция возвращает 1 при успехе.
-1 если канал не создан.
0 если не удалось запустить процесс.
 
 Top
lps
Отправлено: 14 Июля, 2022 - 11:07:53
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июнь 2021  
Репутация: 0




 Zireael пишет:
 Цитата:
createpipeprocess(), sendpipe, waitpipe ошибку НЕ возвращают

Что они возвращают?:
CODE:
int result = createpipeprocess("powershell.exe -NoLogo");
messagebox(result);

 Цитата:
Функция возвращает 1 при успехе.
-1 если канал не создан.
0 если не удалось запустить процесс.


Возвращает "1"

waitpipe() возвращает >0

(Отредактировано автором: 14 Июля, 2022 - 11:10:49)

 
 Top
Zireael
Отправлено: 14 Июля, 2022 - 11:28:17
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4397
Дата рег-ции: Нояб. 2017  
Репутация: 580




Кибор с правами админа запущен?
Попробуйте другой скрипт:
CODE:
if(createpipeprocess("powershell.exe -NoLogo")==1)
{
sendpipe("start calc.exe^n"); // открыть калькулятор
pause(1000);
closepipeprocess();
}
else messagebox("Канал не создан");

Посмотрите журнал антивирусника, может он блокирует.

(Отредактировано автором: 14 Июля, 2022 - 11:29:29)

 
 Top
lps
Отправлено: 14 Июля, 2022 - 12:13:39
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июнь 2021  
Репутация: 0




 Zireael пишет:
Кибор с правами админа запущен?
Попробуйте другой скрипт:
CODE:
if(createpipeprocess("powershell.exe -NoLogo")==1)
{
sendpipe("start calc.exe^n"); // открыть калькулятор
pause(1000);
closepipeprocess();
}
else messagebox("Канал не создан");

Посмотрите журнал антивирусника, может он блокирует.


спасибо, я чуть позже проверю!
 
 Top
Redear
Отправлено: 16 Марта, 2023 - 20:54:43
Post Id



Пользователь
Мастер


Покинул форум
Сообщений всего: 193
Дата рег-ции: Июль 2022  
Репутация: 0




прошу прокомментировать, какой обмен данными между приложениями более быстрый через Pipe канал или прямая запись в процесс
 
 Top
Zireael
Отправлено: 17 Марта, 2023 - 01:52:45
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4397
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
какой обмен данными между приложениями более быстрый через Pipe канал или прямая запись в процесс

Работа с памятью быстрее, но если не собираетесь передавать гигабайты данных, то нет смысла задумываться над этим.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« О программе Кибор »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by