Данные функции позволяют запускать приложения и обмениваться с ними данными по 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 - ожидает пока в канале не появятся данные для чтения.
Функция выходит из ожидания при появление первых данных. Не ожидает окончания когда все данные будут готовы для чтения.
Возвращает количество байт готовых для чтения. Может отличаться от количества которые можно будут прочитать по окончанию обработки введенной команды процессом.
======================================
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: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();//Завершим процесс и закрываем канал
} |