Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters

Reply
 
Thread Tools

_popen
Old 29.05.2003, 08:16   #1
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Rep Power: 0
Default _popen

у меня в неконсольном приложении _popen всегда возвращает NULL
в консольном то же самое работает

_popen можно использовать только в консольных приложениях ?
если да то как быть в случае с неконсольным ?

Old 29.05.2003, 09:53   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
Default

Если нельзя в оконном приложении,
А ты сделай AllocConsole() перенаправь stdout на него может тогда заработает.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!

Old 29.05.2003, 10:10   #3
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
Default

Арс, вот еще покопавшись в 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
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!

Old 29.05.2003, 17:54   #4
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Rep Power: 0
Default

спасибо, я тоже покопался в 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.

Old 30.05.2003, 06:20   #5
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
Default

а я знаю способ, как создать консоль из неконсольного приложения и перенаправлять IO.

если понадобится..
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/

Old 30.05.2003, 07:37   #6
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
Default

Quote:
Originally posted by Greco El
а я знаю способ, как создать консоль из неконсольного приложения и перенаправлять IO.

если понадобится..
А ты можешь сделать так, чтобы cout тоже выводил в это консольное окно?
Если не знаешь как - скажу!
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!

Old 30.05.2003, 09:27   #7
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Rep Power: 0
Default

ещё проблема.
вот это работает в неконсольном приложении:

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. "

как с этим бороться ?

Old 30.05.2003, 09:49   #8
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
Default

Есть идеи:
1. Когда создаешь отдельный поток в нем ты делаешь TRUE inherithandle?
2. Тупо конечно, но попробуй еще так
CreateProcess(_T("cmd"), NULL,...)
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!

Old 30.05.2003, 13:56   #9
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Rep Power: 0
Default

неа.. не помогло
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 09:18.
Top

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.