Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Честно говоря я понятия не имею почему не работает если в этом коде раскомментировать отправку "window = Tk()", которая прекрасно сама сработает и прочитается ответ. Но потом если что то отправить, то оно не выполнится и с канала ничего нельзя будет прочитать..
CODE:#define STARTF_USESHOWWINDOW 1
#define STARTF_USESTDHANDLES 256
#define SW_HIDE 0
#define INFINITE -1
#define NULL 0
external(INT, "CreatePipe", "CreatePipe", "kernel32.dll");
external(VOID, "ZeroMemory", "RtlZeroMemory", "kernel32.dll");
external(VOID, "GetStartupInfo", "GetStartupInfoA", "kernel32.dll");
external(INT, "CreateProcess", "CreateProcessA", "kernel32.dll");
external(INT, "PeekNamedPipe", "PeekNamedPipe", "kernel32.dll");
external(INT, "ReadFile", "ReadFile", "kernel32.dll");
external(INT, "WriteFile", "WriteFile", "kernel32.dll");
external(INT, "TerminateProcess", "TerminateProcess", "kernel32.dll");
external(INT, "WaitForSingleObject", "WaitForSingleObject", "kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "kernel32.dll");
string path_python=pathfolder()+"python\python.exe -i";//Можно писать полный путь к интерпретатору Python если он не в папке с Кибор
int hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;
char pi[16];
char W_buff[10000];
string Rez;
int readed;
int PythonbytesAvail;
int lBytesWrite;
string COMMAND;
if (StartPython())//Запустить интерпретатор python и наладить с ним связь PIPE
{
//Ждем пока будет ответ РАБОТАЕТ
PythonbytesAvail=0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 1");
goto er;
}
sleep(1);
}
messagebox ("0 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////
//Отправляем команду
COMMAND="from tkinter import *";
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
messagebox ("Отправили "+COMMAND);
//Ждем пока будет ответ РАБОТАЕТ
PythonbytesAvail = 0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 2");
goto er;
}
sleep(1);
}
messagebox ("1 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
//Считываем ответ
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////
/*
//Отправляем команду
COMMAND="window = Tk()";
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
messagebox ("Отправили "+COMMAND);
//Ждем пока будет ответ РАБОТАЕТ
PythonbytesAvail = 0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 3");
goto er;
}
sleep(1);
}
messagebox ("2 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
//Считываем ответ
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////
*/
//////////////////////////// А тут уже не работает ЕСЛИ РАСКОММЕНТИРОВАТЬ ВЕРХИЙ КОД. ТО ЕСТЬ "window = Tk()"
//Отправляем команду
COMMAND="print(5)";
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
messagebox ("Отправили "+COMMAND);
//Ждем пока будет ответ НЕ ДОЖДЕМСЯ, потому что переде этим было "window = Tk()" который прекрасно отработал
PythonbytesAvail = 0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 4");
goto er;
}
sleep(1);
}
messagebox ("3 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
//Считываем ответ
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////
ClosePython();//Завершить работу с каналом и интерпретатором
}
er:;
function StartPython()
{
int ret;
//SECURITY_ATTRIBUTES
char sa[12];
initialarray(#sa[0], 0);
writeaddress(sizearray(sa), address(#sa[0]));
writeaddress(0, address(#sa[4]));
writeaddress(1, address(#sa[8]));
ret=CreatePipe(address(#hReadPipe1),address(#hWritePipe1),address(#sa[0]),0);
if (ret==0)return 0;
ret=CreatePipe(address(#hReadPipe2),address(#hWritePipe2),address(#sa[0]),0);
if (ret==0)return 0;
//STARTUPINFO
char si[68];
initialarray(#si[0], 0);
ZeroMemory(address(#si[0]),sizearray(si));
GetStartupInfo(address(#si[0]));
writeaddress(sizearray(si), address(#si[0]));
writeaddress(STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES, address(#si[44]));
writeaddress(SW_HIDE, address(#si[48]));
writeaddress(hReadPipe2, address(#si[56]));
writeaddress(hWritePipe1, address(#si[60]));
writeaddress(hWritePipe1, address(#si[64]));
//PROCESS_INFORMATION
initialarray(#pi[0], 0);
ret=CreateProcess(0,path_python,0,0,1,0,0,0,address(#si[0]),address(#pi[0]));
if (ret==0)return 0;
return 1;
}
function ClosePython()
{
TerminateProcess(addressi(address(#pi[0])), 0);
WaitForSingleObject(addressi(address(#pi[0])), INFINITE );
CloseHandle(addressi(address(#pi[0])));
CloseHandle(addressi(address(#pi[4])));
CloseHandle(hReadPipe1);
CloseHandle(hWritePipe1);
CloseHandle(hReadPipe2);
CloseHandle(hWritePipe2);
} |