Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 5.78 Запуск процесса и налаживание Pipe канала с ним

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

1. Kibor - 26 Января, 2021 - 07:50:45 - перейти к сообщению
Данные функции позволяют запускать приложения и обмениваться с ними данными по 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();//Завершим процесс и закрываем канал
}
2. Kibor - 27 Января, 2021 - 07:47:23 - перейти к сообщению
Если в выводе из 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();//Завершим процесс и закрываем канал
}
3. Kibor - 27 Января, 2021 - 10:11:49 - перейти к сообщению
Пример проверки пинга и вывода пинга на диалог ограниченное количество времени с выходом из режима пингования.

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();//Завершим процесс и закрываем канал
}
4. lps - 14 Июля, 2022 - 02:12:18 - перейти к сообщению
Я использую в скрипте 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 команда не срабатывает

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

Помогите пожалуйста, может у кого-то есть идеи почему там может быть?
5. Zireael - 14 Июля, 2022 - 02:59:59 - перейти к сообщению
 Цитата:
createpipeprocess(), sendpipe, waitpipe ошибку НЕ возвращают

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

 Цитата:
Функция возвращает 1 при успехе.
-1 если канал не создан.
0 если не удалось запустить процесс.
6. lps - 14 Июля, 2022 - 03:07:53 - перейти к сообщению
 Zireael пишет:
 Цитата:
createpipeprocess(), sendpipe, waitpipe ошибку НЕ возвращают

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

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


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

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

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

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


спасибо, я чуть позже проверю!
9. Redear - 16 Марта, 2023 - 13:54:43 - перейти к сообщению
прошу прокомментировать, какой обмен данными между приложениями более быстрый через Pipe канал или прямая запись в процесс
10. Zireael - 16 Марта, 2023 - 18:52:45 - перейти к сообщению
 Цитата:
какой обмен данными между приложениями более быстрый через Pipe канал или прямая запись в процесс

Работа с памятью быстрее, но если не собираетесь передавать гигабайты данных, то нет смысла задумываться над этим.

Powered by ExBB FM 1.0 Final