Twoja koncepcja:
- Kod: Zaznacz cały
char buffer[1024];
do
{
PeekNamedPipe(hRead,NULL,0,NULL,&bytes_avail,NULL);
ShowMessage("Są dane "+ (String) bytes_avail);
if(bytes_avail == 0) return;
ReadFile(hRead,buffer,1023,&bytes_read,NULL);
out.append(buffer,buffer + bytes_read);
}while(1);
Tylko że od razu zawiesza program przy większej ilości danych z PHP nawet ani razu pętla się nie wykona. Wiec dlaczego tak się dzieje ?
-----------
Nawet bez pobierania danych w pętli nie idzie sprawdzić czy coś jest w rurze, bo też program się zawiesza.
- Kod: Zaznacz cały
if(PeekNamedPipe(hRead,NULL,0,NULL,&bytes_avail,NULL))
{
ShowMessage("Są dane "+ (String) bytes_avail);
}
Coś mi się wydaje, że błąd jest gdzie indziej, ale już nie mam dziś do tego głowy. Oto caly kod który wiesza program:
- Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof ( SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hRead;
HANDLE hWrite;
DWORD bytesRead;
SECURITY_ATTRIBUTES sat;
STARTUPINFO si;
ZeroMemory( &si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
//Tworzenie potoku...
sat.nLength = sizeof(SECURITY_ATTRIBUTES);
sat.lpSecurityDescriptor = NULL;
sat.bInheritHandle = TRUE;
CreatePipe((PHANDLE)&hRead, (PHANDLE)&hWrite, &sat, NULL);
/* wejście */
si.hStdInput = CreateFile("E:\\php\\test.php",
GENERIC_READ,
FILE_SHARE_READ,
&sa,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
/* wyjście */
si.hStdOutput = (PHANDLE)hWrite;
si.hStdError = (PHANDLE)hWrite;
PROCESS_INFORMATION ProcessInfo;
if(CreateProcess(NULL,
"E:\\php\\php-cgi.exe",
NULL,
NULL,
TRUE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE); //<--- czekamy...
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
DWORD bytes_read;
DWORD bytes_avail;
DWORD dw,read;
std::string out; //<--- to jest przykladowo
if(PeekNamedPipe(hRead,NULL,0,NULL,&bytes_avail,NULL))
{
ShowMessage("Są dane "+ (String) bytes_avail);
}
}
Twoja kolej skoro wiesz jak to rozwiązać to słucham...
-----------
Widzę, że "Tu" się blokuje
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
po zamianie tego na np
WaitForSingleObject(ProcessInfo.hProcess,1000);
Program się nie wiesza wiec ciekawe ze Twój program działał....
Masz teraz okazję to udowodnić stosownym kodem - działającym kodem.