Осваиваю работу с консольным приложением из внешней проги. Записывать получается, а с чтением никак. Вот рабочий код:
Код | 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. Те же действия в командной строке нормально работают - см. вложение. Как программно реализовать чтение? Спасибо. |