c ++ - Omdirigering CreateProcess input stream til en fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger CreateProcess til at erstatte et system () opkald i min kode. Jeg brugte:


system(xfoil.exe < create\_results.txt");


Som jeg substituerer ved dette:


PROCESS\_INFORMATION ProcessInfo; //This is what we get as an [out] parameter
STARTUPINFO StartupInfo; //This is an [in] parameter

LPCWSTR input\_file = \_tcsdup(TEXT(".\create\_results.txt"));

HANDLE inpfl = CreateFile(input\_file, GENERIC\_READ, FILE\_SHARE\_READ, NULL, OPEN\_EXISTING, FILE\_ATTRIBUTE\_NORMAL, NULL);
StartupInfo.hStdInput = inpfl;

ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo; //Only compulsory field
LPCWSTR exe\_path =\_tcsdup(TEXT(".\xfoil.exe"));

if (CreateProcess(exe\_path, NULL,
    NULL, NULL, FALSE, CREATE\_NEW\_CONSOLE, NULL,
    NULL, &StartupInfo, &ProcessInfo))
{
    WaitForSingleObject(&ProcessInfo.hProcess, 2000);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(inpfl);
}

else
{
    CloseHandle(inpfl);
    std::cout << "Could not create xfoil process" << std::endl;
}


Årsagen er, at jeg skal kontrollere, hvor længe processen er tilladt at løbe (2000m i dette tilfælde), men det ser ud til, at denne metode ikke virker.
Jeg omdirigerer input af processen til håndtaget på den fil, jeg vil have som input (for at erstatte < operatøren), men processen modtager ikke noget. Det lancerer dog xfoil.exe i en separat konsol.

Bedste reference


Du skal angive filsikkerhedsattributter for at tillade håndteringen at blive arvet og startoplysninger info flag for at gøre børneprocessen bruge håndtaget passeret:


::STARTUPINFO startup\_information{};

::SECURITY\_ATTRIBUTES security\_attributes
{
    sizeof(::SECURITY\_ATTRIBUTES)
,   nullptr
,   TRUE // allow handle to be inherited
};

::HANDLE const inpfl{::CreateFileW(input\_file, GENERIC\_READ, FILE\_SHARE\_READ, ::std::addressof(security\_attributes), OPEN\_EXISTING, FILE\_ATTRIBUTE\_NORMAL, NULL)};
if(INVALID\_HANDLE\_VALUE == inpfl)
{
    auto const last\_error{::GetLastError()};
    // handle error...
}

startup\_information.cb = sizeof(startup\_information);
startup\_information.dwFlags = STARTF\_USESTDHANDLES;
startup\_information.hStdInput = inpfl;

Andre referencer 1



PROCESS\_INFORMATION ProcessInfo; //This is what we get as an [out] parameter
STARTUPINFO StartupInfo; //This is an [in] parameter

LPCWSTR input\_file = \_tcsdup(TEXT(".\create\_results.txt"));

HANDLE inpfl = CreateFile(input\_file, GENERIC\_READ, FILE\_SHARE\_READ, NULL, OPEN\_EXISTING, FILE\_ATTRIBUTE\_NORMAL, NULL);
StartupInfo.hStdInput = inpfl;



Hvad sker der med StartupInfo.hStdInput efter det næste opkald?



ZeroMemory(&StartupInfo, sizeof(StartupInfo));



Ups ... hStdInput nulstillet nu


Gør dette i første omgang ...


PROCESS\_INFORMATION ProcessInfo = {};
STARTUPINFO StartupInfo = {};


... vil forhindre dig i at skulle nulstille noget ... se [7]


I henhold til CreateProcess StartupInfo-dokumentation skal du hStdInput indstille dwFlags til STARTF\_USESTDHANDLES , ellers er standardindgangen tastaturbufferen [8]