On November 2, 2002 10:41 am, Jaco Greeff wrote: > +#define POPEN_WCMD_EXEC "C:\\Windows\\System32\\cmd.exe /c" Do we need this hardcoded path here?!? What about the COMSPEC idea that Francois suggested? > +#define LPCWSTR_TO_LPSTR(wszIn, nIn, szOut, nOut) \ > + *nOut = WideCharToMultiByte(CP_ACP, 0, wszIn, nIn, NULL, 0, NULL, > NULL); \ > + szOut = (CHAR *)MSVCRT_malloc((*nOut+1)*sizeof(CHAR)); > \ > + if (szOut) > \ > + { > \ > + WideCharToMultiByte(CP_ACP, 0, wszIn, nIn, szOut, *nOut+1, NULL, > NULL); \ > + szOut[nLen] = '\0'; > \ > + } > \ > + else > \ > + *nOut = 0; > + > +#define CREATE_PIPE(hRead, hWrite, security) \ > + if (!CreatePipe(&hRead, &hWrite, &security, 0)) > \ > + { > \ > + TRACE("Creation of pipe failed\n"); > \ > + return NULL; > \ > + } > + > +#define REDIRECT_STREAM(type, handle)\ > + if (!SetStdHandle(type, handle)) > \ > + { > \ > + TRACE("Redirection of stream failed"); > \ > + return NULL; > \ > + } > + > +#define RESTORE_STREAM(type, handle) \ > + if (!SetStdHandle(type, handle)) > \ > + TRACE("Restore of stream failed\n"); > + > +#define DUPLICATE_HANDLE(hHandle, hDup, type, hOrig) \ > + if (!DuplicateHandle(GetCurrentProcess(), hHandle, > \ > + GetCurrentProcess(), &hDup, 0, > \ > + FALSE, DUPLICATE_SAME_ACCESS)) > \ > + { > \ > + TRACE("Duplication of piped handle failed\n"); > \ > + RESTORE_STREAM(type, hOrig); > \ > + return NULL; > \ > + } > \ > + else > \ > + CloseHandle(hHandle); What's up with all the macro abuse? :) We don't like cpp that much! ;) Please, try to do things without macros, it can't be that bad. -- Dimi.