Uwe Bonnes a écrit :
"Eric" == Eric Pouech pouech-eric@wanadoo.fr writes:
Eric> Uwe Bonnes a écrit : >> Changelog: dlls/msvcrt/console.c: msvcrt_init_console Use >> DuplicateHandle for STDOUT too ( CreateFileA("CONOUT$" failed) Bump >> up error reporting of missing console handles Eric> that's that's not a correct fix... this handles must be to the Eric> console itself, whatever the input / output handles are (from Eric> process inheritance) the issue you have is that you run your Eric> program without being attached to a (wine) console... you're Eric> facing the corner cases of running wine with the "fake" console as Eric> being inherited from the unix stdin/stdout streams the correct fix Eric> would be to let OpenConsoleW work in those cases A+ -- Eric Pouech
Would it be right to first try to open the console and and on failure to use DuplicateHandle?
that would be a better fix IMO (you should also change the opening of CONIN$ in msvcrt:msvcrt_init_console) Index: console.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/console.c,v retrieving revision 1.40 diff -u -u -r1.40 console.c --- console.c 14 Apr 2005 11:30:10 -0000 1.40 +++ console.c 28 May 2005 08:45:36 -0000 @@ -212,7 +212,7 @@ static const WCHAR coninW[] = {'C','O','N','I','N','$',0}; static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0}; BOOL output; - HANDLE ret; + HANDLE ret;
if (strcmpiW(coninW, name) == 0) output = FALSE; @@ -240,7 +240,27 @@ ret = reply->handle; } SERVER_END_REQ; - return ret ? console_handle_map(ret) : INVALID_HANDLE_VALUE; + if (ret) + ret = console_handle_map(ret); + else + { + int fd; + DWORD attr; + + /* likely, we're not attached to a windows-console + * let's try to return a handle to the unix-console + */ + fd = open("/dev/tty", output ? O_WRONLY : O_RDONLY); + ret = INVALID_HANDLE_VALUE; + if (fd != -1) + { + attr = (output ? GENERIC_WRITE : GENERIC_READ) | SYNCHRONIZE; + if (wine_server_fd_to_handle(fd, attr, inherit, &ret)) + ret = INVALID_HANDLE_VALUE; + close(fd); + } + } + return ret; }
/******************************************************************