CreateProcess Pipe всегда пуст - PullRequest
       0

CreateProcess Pipe всегда пуст

0 голосов
/ 13 февраля 2019

Я пытаюсь создать .dll для моего приложения C # UWP на C ++.Я хочу получить вывод команды CreateProcess с использованием Pipes.

Результатом должен быть вывод консоли .jar-файла, но я получаю пустую строку.Возможно, проблема в флаге STARTF_USESTDHANDLES, который не может быть добавлен.

По этой ссылке (https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/ns-processthreadsapi-_startupinfoa), значение этой константы будет равно «0x00000100», поэтому я попытался использовать 256 вместо этого, но этоничего не меняет.

HANDLE rPipe, wPipe;

//Create pipes to write and read data
CreatePipe(&rPipe, &wPipe, NULL, 0);

STARTUPINFO sInfo;
ZeroMemory(&sInfo, sizeof(sInfo));
PROCESS_INFORMATION pInfo;
ZeroMemory(&pInfo, sizeof(pInfo));
sInfo.cb = sizeof(sInfo);
//sInfo.dwFlags = STARTF_USESTDHANDLES;
sInfo.dwFlags = 256;
sInfo.hStdInput = NULL;
sInfo.hStdOutput = wPipe;
sInfo.hStdError = wPipe;

//if (!SetHandleInformation(wPipe, HANDLE_FLAG_INHERIT, 0))
    //return "Error SetHandleInformation";

//Create the process here.
string cmd = "java -jar decode.jar \"" + bitString + "\"";

// Assumes std::string is encoded in the current Windows ANSI codepage
int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, cmd.c_str(), cmd.size(), NULL, 0);

if (bufferlen == 0)
{
    // Something went wrong. Perhaps, check GetLastError() and log.
    CloseHandle(wPipe);
    CloseHandle(rPipe);
    return "errorBuffer";
}

// Allocate new LPWSTR - must deallocate it later
LPWSTR cmdLine = new WCHAR[bufferlen + 1];

::MultiByteToWideChar(CP_ACP, 0, cmd.c_str(), cmd.size(), cmdLine, bufferlen);

// Ensure wide string is null terminated
cmdLine[bufferlen] = 0;

if (!CreateProcessW(L"C:\\Program Files (x86)\\Java\\jdk1.8.0_161\\bin\\java.exe", cmdLine, 0, 0, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, 0, 0, &sInfo, &pInfo)) {
    CloseHandle(wPipe);
    CloseHandle(rPipe);
    return "errorProcess";
}


WaitForSingleObject(pInfo.hProcess, INFINITE);
CloseHandle(wPipe);

//now read the output pipe here.

char buf[100];
DWORD reDword;
string m_csOutput;
BOOL res;
do
{
    res = ReadFile(rPipe, buf, 100, &reDword, 0);
    m_csOutput += buf;
} while (res);

CloseHandle(rPipe);

return m_csOutput.c_str();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...