Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.23.123] |
|
Страницы: (4) 1 [2] 3 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Прани, сорри конечно ... но я совсем не вкурил, как производится запуск?
Через сиспемный пайп? Типа: proramm-1 | proramm-2 Или как-то иначе?? |
Сообщ.
#17
,
|
|
|
Цитата JoeUser @ Нет, сугубо программно. Но смысл ровно таков же с той лишь разницей, что пишуемое в пайп заранее неизвестно и формируется по ходу дела. Или как-то иначе?? |
Сообщ.
#18
,
|
|
|
Цитата Qraizer @ Нет, сугубо программно. Qraizer, стоп. Есть две программы. Пайп - это решение обмена, стандартизованное ОС. Если это не оно - то что оно? Добавлено АДД: да, есть еще атавизмы в виде "мэйл-слотов", но это явно не они. |
Сообщ.
#19
,
|
|
|
Вообще говоря, за такие вещи нужно по рукам и розгами. Вот что в голове у этих иксоидов творится, что они с пеной у рта рассказывают, какая у них вся из себя унифицированная архитектура, всё суть файлы, даже внешние устройства, даже процессор и память, а на деле чекают, чё им подсунули и меняют алгоритмы. Какая тебе нафик разница, что у тебя с той стороны stdin-а? Зла не хватает, половина кроссплатформенного оперсорса более кроссплатформенен на винде, чем в позиксе...
Добавлено Цитата JoeUser @ Это оно. Только оно для юзера. Оно программно как раз так и реализуется, через CreatePipe() etc. Только делает это оболочка. Ну, в винде это cmd. И ничего не надо программить. Но это решение статично. Если нужно динамически общаться, юзер не справится, ему придётся что-нить наскриптовать хотя бы. Пайп - это решение обмена, стандартизованное ОС. Если это не оно - то что оно? |
Сообщ.
#20
,
|
|
|
Цитата Qraizer @ Но оно статично. Ой ли ... ой лю ли ... echo "Oi li, oi lu li" | program cat myfile | program ls /usr/local/bin | grep YO | program & etc ... !!! Все наоборот! Изначальная обработка может быть любая, но вывод в STDOUT будет одинаков. А вот как его отработает прога в STDIN - вопрос. ИМХО, И ящетаю - привязываться к API Венды (именно в этом случае) - это кощунство и сатанинство!!! И издевательство над православными! |
Сообщ.
#21
,
|
|
|
И где тут динамика, JoeUser? Наладь между grep и program двусторонний диалог.
|
Сообщ.
#22
,
|
|
|
Цитата Qraizer @ Наладь между grep и program двусторонний диалог. Ну я так понимаю, "двусторонность" не равна "динамичности"? Как я понимаю, динамичность может просто подразумевать какую-то зависимость исходящих величин - от входящих (читай функцию). А если обобщить - рассматриваем не только способ обработки, но и его построение, читай - получаем что-то типа "функтора". Хотя может я и загоняюсь |
Сообщ.
#23
,
|
|
|
В результате получилась запись, но не получается чтение. Вот рабочий код:
UnicodeString Cons_App = L"Python -i"; HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; STARTUPINFO si; try { SetCurrentDir(CurDir); ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; CreatePipe(&hReadOut, &hWriteOut, &sa, NULL); DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS); CloseHandle(hReadOut); CreatePipe(&hReadIn, &hWriteIn, &sa, NULL); DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS); CloseHandle(hWriteIn); ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = hReadIn; si.hStdOutput = hWriteOut; CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); DWORD count = 0; char buf[1024]; strcpy(buf,"f= open(\"D:\\__aa.txt\",\"w+\")\r\n"); WriteFile(hWriteInDup, buf, strlen(buf), &count, NULL); // создание файла strcpy(buf,"f.write(\"1\n\")\r\n"); WriteFile(hWriteInDup, buf, strlen(buf), &count, NULL); // запись в файл "1\n" DWORD cread = 0; // чтение bool ret = true; for(int i=0; i < 10; i++) { ret = PeekNamedPipe(hWriteOutDup, NULL, 0, NULL, &count, NULL); ret = ret && (count > 0); if (ret) break; Sleep(1000); } if (ret) { ret = ReadFile(hWriteOutDup, buf, count, &cread, NULL); } // while (ret) // { // ret = ReadFile(hWriteOutDup, buf, strlen(buf), &count, NULL); // read from the pipe // if (!ret && GetLastError() != ERROR_MORE_DATA) // break; // } strcpy(buf,"f.close()\r\n"); WriteFile(hWriteInDup, buf, strlen(buf), &count, NULL); // закрытие файла CloseHandle(hWriteInDup); CloseHandle(hReadOut); CloseHandle(hWriteIn); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); Результат PeekNamedPipe - всегда false. Те же действия в командной строке нормально работают - см. вложение. Как программно реализовать чтение? Прикреплённая картинка
При этом команда записи в файл не проходит. |
Сообщ.
#24
,
|
|
|
А с чего ты уверен, что команды туда приходят? Я ради такого случая поставил себе Python, не факт, что твоей версии, правда, и ничего работающего не обнаружил. Написал свою простейшую аппликуху, без этого дурацкого ветвления по типу tty, и в ней всё работает как часы, в обе стороны.
|
Сообщ.
#25
,
|
|
|
Цитата Qraizer @ А с чего ты уверен, что команды туда приходят? Файл образуется (f=open) и закрывается (f.close). Добавлено Цитата vlad2 @ без этого дурацкого ветвления по типу tty Что имеется в виду? Добавлено В сообщении #8 давал ссылку на Питон. Запускать его надо с опцией -i. |
Сообщ.
#26
,
|
|
|
У меня 3.8.1. Поведение отличается.
Короче, долби саппорт питона. Боюсь, без их помощи не обойтись. Тебе вот надо, чтобы твой код под каждую версию работал по-разному? Думаю, такое веселье никому не понравится. |
Сообщ.
#27
,
|
|
|
Цитата Qraizer @ Это точно(. Думаю, такое веселье никому не понравится |
Сообщ.
#28
,
|
|
|
Цитата vlad2 @ Цитата Qraizer @ Это точно(.Думаю, такое веселье никому не понравится А у меня всё получилось - после "python -i". Только я делал для x86. Где то у тебя ошибка. --- А вот этого я не делал никогда. ... DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS); ... DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS); ... |
Сообщ.
#29
,
|
|
|
Цитата ЫукпШ @ А у меня всё получилось Здорово! Я упростил код, убрал DuplicateHandle: UnicodeString Cons_App = L"Python -i"; HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; STARTUPINFO si; try { ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; CreatePipe(&hReadOut, &hWriteOut, &sa, NULL); CreatePipe(&hReadIn, &hWriteIn, &sa, NULL); ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = hReadIn; si.hStdOutput = hWriteOut; si.hStdError = hWriteOut; CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); DWORD count = 0; char buf[1024]; strcpy(buf,"f= open(\"D:\\__aa.txt\",\"w+\")\r\n"); WriteFile(hWriteIn, buf, strlen(buf), &count, NULL); // создание файла strcpy(buf,"f.write(\"1\n\")\r\n"); WriteFile(hWriteIn, buf, strlen(buf), &count, NULL); // запись в файл "1\n" DWORD cread = 0; // чтение bool ret = true; for(int i=0; i < 10; i++) { ret = PeekNamedPipe(hWriteOut, NULL, 0, NULL, &count, NULL); ret = ret && (count > 0); if (ret) break; Sleep(1000); } if (ret) { if (count > strlen(buf)) count = strlen(buf); ret = ReadFile(hWriteOut, buf, count, &cread, NULL); } strcpy(buf,"f.close()\r\n"); WriteFile(hWriteIn, buf, strlen(buf), &count, NULL); // закрытие файла strcpy(buf,"exit()\r\n"); WriteFile(hWriteIn, buf, strlen(buf), &count, NULL); // выход из Питона CloseHandle(hReadIn); CloseHandle(hWriteOut); CloseHandle(hReadOut); CloseHandle(hWriteIn); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); Всё равно не записывает в файл и не читает. Остальные команды проходят. Можешь посмотреть мой код на предмет ошибки или дать свой, который работает? |
Сообщ.
#30
,
|
|
|
Цитата vlad2 @ Можешь посмотреть мой код на предмет ошибки или дать свой, который работает? Да, но только вечером или ночью. --- Но я делал не так, как ты. Чтобы мастерить такие приложения на постоянной основе, я сделал некоторые классы и процедуры, которые занёс в библиотеку. Поэтому исходников получается не один. Но зато растёт производительность труда. 1. Делаем класс - Hahdle. Это весьма нужный класс. 2. Делаем класс - Pipe. 3. Делаем класс - Обёртку процесса для консольных приложений и .bat файлов. 4. Для удобства - обёртку вокруг памяти. 5. Класс - конвертор форматов 6. Делаем класс - обёртку для управления консольным приложением На основе сделанного набора И ещё там чего-то в виде библиотечных процедур. В результате получился такой исходник: #include "cmdShell.h" bool WriteToPython(cmdShell& cSh, const char* pStr) { bool bRetC=false; size_t sizeWr = strlen(pStr); if(sizeWr) { // ConvTchar2Char conv; // DbgStr::TypeDebugString(_T("%s %s"),_T(__FUNCTION__), conv.Char2Tchar(pStr)); if(!cSh.WriteToPipe (pStr,sizeWr)) return false; } MEMT<char> buf; bRetC = cSh.ReadFromPipe (buf); size_t size = buf.GetDataSize(); // _tprintf(_T("bRetC(ReadFromPipe)=%d size=%d\n"),bRetC,size); if((bRetC)&&(size)) { for(size_t i=0;i<size;++i) { _tprintf(_T("%c"),buf[i]); } } _tprintf(_T("\n")); return bRetC; } // -------------------------------------------------------------------------- int __cdecl _tmain(int argc, char **argv) { _tprintf(_T("\tHello, world!\n")); cmdShell cSh; bool bRetC = cSh.Install("python -i"); if(bRetC) { WriteToPython(cSh, ""); // создаём файл aa.txt в папке d:\0 WriteToPython(cSh, "f=open(\"d:\\\\0\\\\aa.txt\",\"w+\")\n"); WriteToPython(cSh, "f.write(\"223\")\n"); WriteToPython(cSh, "f.close()\n"); WriteToPython(cSh, "exit()\n"); } else { _tprintf(_T("bRetC(install)=%d\n"),bRetC); } return 0; } Приаттаченные исходники я надёргал из библиотеки, что-то мог и забыть. Прикреплённый файлForPython.zip (10,04 Кбайт, скачиваний: 337) |