On 10/08/2007 02:01, Ilya Bobir wrote:
> Ilya Bobir wrote:
>> [...]
>>
>> It does work on NT.  But CreateProcess(..., CREATE_NO_WINDOW, ...) is 
>> needed.  An example implementation is attached.
>>   
> 
> I've just found slightly different approach to creating a console for a 
> child process.  It has an advantage of creating one console per child 
> thus allowing communication with more that one child process.
> Here is the code:
> 
> SECURITY_ATTRIBUTES sa;
> PROCESS_INFORMATION pi;
> HANDLE newstdin, newstdout;
> HANDLE read_stdout, write_stdin; 
> 
> sa.lpSecurityDescriptor = 0;
> sa.nLength = sizeof(SECURITY_ATTRIBUTES);
> sa.bInheritHandle = true;
> 
> CreatePipe(&newstdin, &write_stdin, &sa, 0);
> CreatePipe(&read_stdout, &newstdout, &sa, 0);
> 
> GetStartupInfo(&si);
> si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
> si.wShowWindow = SW_HIDE;  // hide child application window
> si.hStdOutput = newstdout; // use newstdout instead of STDOUT
> si.hStdError  = newstdout; // use newstdout instead of STDERR
> si.hStdInput  = newstdin;  // use newstdin instead of STDIN
> 
> if(0 == CreateProcess(
>   exe, NULL, NULL, NULL, true, CREATE_NEW_CONSOLE,
>   NULL, NULL, &si, &pi))
> {
>   printf("\nCreateProcess() fails with error: %i", GetLastError());
>   return -1;
> }
> 
> 
> In case pipes are in blocking mode then the PeekNamedPipe() call can be 
> used to check for incoming data:
> 
> if (0 == PeekNamedPipe(
>   read_stdout, buf, BUFSIZE - 1, &bread, &avail, NULL))
> {
>   printf("\nPeekNamedPipe() fails with error: %i", GetLastError());
>   break;
> }
> 
> if (bread > 0)
> {
>   // Data have arrived
> }

All looks good stuff - I'll try and get round to trying it out this weekend.

TTFN

Mike
-- 
Sage advice: To cook well, learn all about spices.

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui