005
23.08.2005, 13:49 Uhr
Skippy
|
wir haben uns da ein klein wenig missverstanden ich schreibe nicht die client seite vom cgi sondern die server seite daher ich muss alles anbieten damit ich die clients benutzen kann daher ich muss dafür sorgen das php_cgi.exe richtig aufgerufen wird und die von php-cgi.exe kommenden daten über nem socket verschickt werden
der code selbst ist für nen webserver den ich schreibe ich hab das mit jana nur getestet wie die daten aussehen die ankommen mein problem ist ja bisher nur das die parameter übergabe bei create process nicht klappt bei create prozess kann man ja die angabe welche exe gestartet wird und den übergebenen parameter jeweils extra als parameter der funktion creat prozess übergeben geht aber komischerweise nicht es klappt nur wenn ich als 2parameter beides als einen string übergebe problem dabei ist nur das ich beides (die auszuführende exe und den parameter(übergebene datei ) extra habe und die nun vorher erst noch zusammenfügn muss
also hier mal die funktion wie ich sie bisher hab bitte wer zeit kann ja mal schauen ob dort fehler sind oder was man verbessern könnte Danke schonmal für eure bisherige gedult und mühe
C++: |
std::string ExecuteCGI() { printf ("\n\nCGI exECUTE,"); std::string answerbuf; char buf[1024]; //i/o buffer
STARTUPINFO si; SECURITY_ATTRIBUTES sa; SECURITY_DESCRIPTOR sd; //security information for pipes PROCESS_INFORMATION pi; HANDLE newstdin,newstdout,read_stdout,write_stdin; //pipe handles
if (IsWinNT()) //initialize security descriptor (Windows NT) { InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, false); sa.lpSecurityDescriptor = &sd; } else sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = true; //allow inheritable handles
if (!CreatePipe(&newstdin,&write_stdin,&sa,0)) //create stdin pipe { ErrorMessage("CreatePipe"); getch(); return 0; } if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //create stdout pipe { ErrorMessage("CreatePipe"); getch(); CloseHandle(newstdin); CloseHandle(write_stdin); return 0; } GetStartupInfo(&si); //set startupinfo for the spawned process /* The dwFlags member tells CreateProcess how to make the process. STARTF_USESTDHANDLES validates the hStd* members. STARTF_USESHOWWINDOW validates the wShowWindow member. */ si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = newstdout; si.hStdError = newstdout; //set the new handles for the child process si.hStdInput = newstdin; char app_spawn[] = "c:\\php\\php-cgi2.exe"; //sample, modify for your //system char app_cmdline[] = "c:\\php\\php-cgi.exe C:\\Programme\\Jana2\\html\\index.php"; //sample, modify for your //system
//spawn the child process if (!CreateProcess(NULL, app_cmdline,// command line NULL,// process security attributes NULL,// primary thread security attributes TRUE,// handles are inherited CREATE_NEW_CONSOLE,// creation flags NULL, // use parent's environment NULL,// use parent's current directory &si, // STARTUPINFO pointer &pi))// receives PROCESS_INFORMATION { std::cout << "Fehler: " << GetLastError();
ErrorMessage("CreateProcess"); getch(); CloseHandle(newstdin); CloseHandle(newstdout); CloseHandle(read_stdout); CloseHandle(write_stdin); return 0; }
unsigned long exit=0; //process exit code unsigned long bread; //bytes read unsigned long avail; //bytes available
printf ("\n\nCGI exECUTE,");
bzero(buf); for(;;) //main program loop { GetExitCodeProcess(pi.hProcess,&exit); //while the process is running if (exit != STILL_ACTIVE) break; //WaitForSingleObject(pi.hProcess,INFINITE); dann brauchen wir die schleife nicht mehr //Durch ändern des WaitForSingleObject kann auch erreicht werden, //dass das Programm nicht endlos wartet, sondern eine vorgegebene Zeit (in Milisekunden) //WaitForSingleObject(pi.hProcess,6000);
PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL); //check to see if there is any data to read from stdout WaitForInputIdle(pi.hProcess, INFINITE); if (bread == 0) { bzero(buf); if (avail > 1023) { while (bread >= 1023) { ReadFile(read_stdout,buf,1023,&bread,NULL); //read the stdout pipe printf("%s",buf); bzero(buf); } } else { ReadFile(read_stdout,buf,1023,&bread,NULL); printf("%s",buf); answerbuf += buf; } } } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(newstdin); //clean stuff up CloseHandle(newstdout); CloseHandle(read_stdout); CloseHandle(write_stdin);
std::string fin_answerbuf; std::string::size_type qm = answerbuf.find("\r\n\r\n"); if (qm != std::string::npos) { std::string url_params = answerbuf.substr(0, qm);
fin_answerbuf = answerbuf.substr(qm+1); }
return fin_answerbuf; }
|
Dieser Post wurde am 23.08.2005 um 13:54 Uhr von Skippy editiert. |