Re: program launcher API for C++?
George Neuner wrote:
There is no way to provide to CreateProcess a list of particular
parent handles to be inherited by the child. Inheritence is
controlled indirectly by the security attributes of the individual
open handles.
[Oh, how off topic we've gone. Hopefully this will be the last.]
{ Agreed. -mod/sk }
As I was saying, there is this obscure barely documented option which
allows you to do just that, for Windows Vista and higher. (This is
also how I got a blue screen when I misused the API.) I would merely
link to the msdn pages, but "obscure barely documented", so here's
some example code. (I reworked it and snipped it for demonstration
purposes - which is my excuse if I got it wrong.) I have tested that
it actually inherits only the specified handles, even if there are
other inheritable handles.
char * memoryBackingAttributeList = 0;
PPROC_THREAD_ATTRIBUTE_LIST attribList;
{
SIZE_T requiredSize = 0;
InitializeProcThreadAttributeList(0, 1, 0, & requiredSize);
memoryBackingAttributeList = new unsigned char[requiredSize];
attribList =
reinterpret_cast<PPROC_THREAD_ATTRIBUTE_LIST>(memoryBackingAttributeList);
if ( ! InitializeProcThreadAttributeList(attribList, 1, 0, &
requiredSize))
FATAL(0, 0);
}
HANDLE handlesList = new HANDLE[numInheritedHandles];
{
int x = 0;
handlesList[x++] = inHandle;
handlesList[x++] = outHandle;
handlesList[x++] = errHandle;
if ( ! UpdateProcThreadAttribute(attribList, 0,
PROC_THREAD_ATTRIBUTE_HANDLE_LIST,
handlesList, sizeof(HANDLE) * numInheritedHandles,
0, 0))
{ FATAL(0, 0);
}
}
STARTUPINFOEX startUpInfoEx;
{
ZeroMemory(&startUpInfoEx, sizeof(STARTUPINFOEX));
startUpInfoEx.StartupInfo.cb = sizeof(STARTUPINFOEX);
startUpInfoEx.lpAttributeList = attribList;
startUpInfoEx.StartupInfo.dwFlags = STARTF_USESTDHANDLES;
startUpInfoEx.StartupInfo.hStdInput = inHandle;
startUpInfoEx.StartupInfo.hStdOutput = outHandle;
startUpInfoEx.StartupInfo.hStdError = errHandle;
}
//...
BOOL const createProcessResult = CreateProcess(
exeAbsPath,
processArguments.t,
0, //security attributes, use default
0, //thread attributes, use default
inheritHandlesFlag,
EXTENDED_STARTUPINFO_PRESENT,
m_hasCustomEnv ? envWrapper.env : 0, //0 is default env
m_dir.c_str(), //working dir for new process
& startUpInfoEx.StartupInfo,
& processInformation
);
CreateProcess
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
STARTUPINFOEX
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686329%28v=vs.85%29.aspx
InitializeProcThreadAttributeList
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683481%28v=vs.85%29.aspx
UpdateProcThreadAttribute
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686880%28v=vs.85%29.aspx
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]