 |
_popen |
 |
29.05.2003, 08:16
|
#1
|
»
Join Date: 01 2002
Posts: 777
Rep Power: 0
|
_popen
у меня в неконсольном приложении _popen всегда возвращает NULL
в консольном то же самое работает
_popen можно использовать только в консольных приложениях ?
если да то как быть в случае с неконсольным ?
|
|
|
29.05.2003, 09:53
|
#2
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Если нельзя в оконном приложении,
А ты сделай AllocConsole() перенаправь stdout на него может тогда заработает.
|
|
|
29.05.2003, 10:10
|
#3
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Арс, вот еще покопавшись в MSDN нашел следующий текст (это то, что мне в начале пришло в голову, потом я написал первый текст  )
NOTE 4: While _pclose() and _popen() do not have direct Win32 equivalents, you can (with some work) simulate them with the following calls:
_popen CreatePipe
CreateProcess
_pclose WaitForSingleObject
CloseHandle
(c) MSDN, october 2001
|
|
|
29.05.2003, 17:54
|
#4
|
»
Join Date: 01 2002
Posts: 777
Rep Power: 0
|
спасибо, я тоже покопался в MSDN и оказалось что _popen можно использовать только в консольных приложениях.
Вот, из того же MSDNа:
The _popen function, from the C Runtime Library, returns an invalid file handle if used in a Windows program which causes the program to hang indefinitely. It works properly in a Console application. To create a Windows application that redirects input and output, read the section "Creating a Child Process that Redirects Input and Output" in the Win32 SDK.
|
|
|
30.05.2003, 06:20
|
#5
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
а я знаю способ, как создать консоль из неконсольного приложения и перенаправлять IO.
если понадобится..
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
30.05.2003, 07:37
|
#6
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Quote:
Originally posted by Greco El
а я знаю способ, как создать консоль из неконсольного приложения и перенаправлять IO.
если понадобится..
|
А ты можешь сделать так, чтобы cout тоже выводил в это консольное окно?
Если не знаешь как - скажу!
|
|
|
 |
|
 |
30.05.2003, 09:27
|
#7
|
»
Join Date: 01 2002
Posts: 777
Rep Power: 0
|
ещё проблема.
вот это работает в неконсольном приложении:
Code:
HANDLE newstdin,newstdout,read_stdout,write_stdin;
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = &sd;
CreatePipe(&newstdin,&write_stdin,&sa,0);
CreatePipe(&read_stdout,&newstdout,&sa,0);
STARTUPINFO si;
PROCESS_INFORMATION p_i;
si.cb=sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = newstdout;
si.hStdError = newstdout;
si.hStdInput = newstdin;
if (!CreateProcess ( NULL, "cmd", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,NULL, NULL, &si, &p_i )){
LPVOID msg;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &msg,0,NULL);
MessageBox(0,msg,msg,0);
LocalFree(msg);
}
char buff[1024];
DWORD dwRead, dwWritten;
WriteFile(write_stdin, "dir\r\n",5, &dwWritten, NULL);
CloseHandle(write_stdin);
unsigned long bread=0;
while ( ReadFile ( read_stdout, buff, sizeof(buff), &dwRead, NULL ) && dwRead != 0 ){
PeekNamedPipe(read_stdout,buff,1023,&bread,NULL,NULL);
if(bread==0) break;
MessageBox(0,buff,buff,0);
memset(buff,0,sizeof(buff));
}
CloseHandle(read_stdout);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(newstdin);
CloseHandle(newstdout);
но если то же самое сделать в отдельном потоке CreateProcess выдает ошибку " Invalid access to memory location. "
как с этим бороться ?
|
|
|
 |
30.05.2003, 09:49
|
#8
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Есть идеи:
1. Когда создаешь отдельный поток в нем ты делаешь TRUE inherithandle?
2. Тупо конечно, но попробуй еще так
CreateProcess(_T("cmd"), NULL,...)
|
|
|
30.05.2003, 13:56
|
#9
|
»
Join Date: 01 2002
Posts: 777
Rep Power: 0
|
неа.. не помогло
|
|
|
All times are GMT. The time now is 09:18. |
|
|