Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
Old 29.05.2003, 09:16   #1
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Downloads: 1
Uploads: 0
Reputation: 0 | 0
Default _popen

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

_popen можно использовать только в консольных приложениях ?
если да то как быть в случае с неконсольным ?
Reply With Quote
Old 29.05.2003, 10:53   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Если нельзя в оконном приложении,
А ты сделай AllocConsole() перенаправь stdout на него может тогда заработает.
Reply With Quote
Old 29.05.2003, 11:10   #3
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
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
Reply With Quote
Old 29.05.2003, 18:54   #4
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Downloads: 1
Uploads: 0
Reputation: 0 | 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.
Reply With Quote
Old 30.05.2003, 07:20   #5
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

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

если понадобится..
Reply With Quote
Old 30.05.2003, 08:37   #6
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

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

если понадобится..
А ты можешь сделать так, чтобы cout тоже выводил в это консольное окно?
Если не знаешь как - скажу!
Reply With Quote
Old 30.05.2003, 10:27   #7
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Downloads: 1
Uploads: 0
Reputation: 0 | 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. "

как с этим бороться ?
Reply With Quote
Old 30.05.2003, 10:49   #8
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Есть идеи:
1. Когда создаешь отдельный поток в нем ты делаешь TRUE inherithandle?
2. Тупо конечно, но попробуй еще так
CreateProcess(_T("cmd"), NULL,...)
Reply With Quote
Old 30.05.2003, 14:56   #9
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Downloads: 1
Uploads: 0
Reputation: 0 | 0
Default

неа.. не помогло
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 07:58.


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