使用`CreateProcess()`创建进程并输出宽字符

问题描述 投票:0回答:1

我使用

CreateProcess()
打开cmd。如果我使用 ascii,它工作正常,但是当我尝试使用宽字符时,它不起作用

int res;

HANDLE Entrada_Rd = nullptr;
HANDLE Entrada_Wr = nullptr;
HANDLE Saida_Rd = nullptr;
HANDLE Saida_Wr = nullptr;

SECURITY_ATTRIBUTES sa;

wchar_t* ptrRespTerm = Resposta;
unsigned long long alocTam = 0;
DWORD tamRespTerm = 0;

sa.nLength = sizeof sa;
sa.lpSecurityDescriptor = 0;
sa.bInheritHandle = 1;

if (!CreatePipe(&Saida_Rd, &Saida_Wr, &sa, 0))
    // error

if (!SetHandleInformation(Saida_Rd, HANDLE_FLAG_INHERIT, 0))
    // error

if (!CreatePipe(&Entrada_Rd, &Entrada_Wr, &sa, 0))
    // error

if (!SetHandleInformation(Entrada_Wr, HANDLE_FLAG_INHERIT, 0))
    // error

PROCESS_INFORMATION pi;
STARTUPINFOW si;

ZeroMemory(&pi, sizeof pi);
ZeroMemory(&si, sizeof si);

si.cb = sizeof si;
si.hStdError = Saida_Wr;
si.hStdOutput = Saida_Wr;
si.hStdInput = Entrada_Rd;
si.dwFlags |= STARTF_USESTDHANDLES;

res = CreateProcessW(L"C:\\WINDOWS\\system32\\cmd.exe", 0, 0, 0, 1, 0, 0, 0, &si, &pi);

有没有办法让它与 wchar_t 输入一起工作,并输出 wchar_t 中的文本?

c++ c winapi createprocess widechar
1个回答
0
投票

是的,您可以使其使用宽字符(wchar_t)进行输入和输出。为此,您需要创建并使用管道句柄的宽字符版本和要执行的命令。此外,您应该配置启动信息结构以使用宽字符句柄。这是如何修改代码的示例

#包括

int main() { int res;

HANDLE Entrada_Rd = nullptr;
HANDLE Entrada_Wr = nullptr;
HANDLE Saida_Rd = nullptr;
HANDLE Saida_Wr = nullptr;

SECURITY_ATTRIBUTES sa;

wchar_t* ptrRespTerm = L"Your command here"; // Replace with your wide character command
unsigned long long alocTam = 0;
DWORD tamRespTerm = 0;

sa.nLength = sizeof sa;
sa.lpSecurityDescriptor = 0;
sa.bInheritHandle = 1;

if (!CreatePipe(&Saida_Rd, &Saida_Wr, &sa, 0))
    // Handle error

if (!SetHandleInformation(Saida_Rd, HANDLE_FLAG_INHERIT, 0))
    // Handle error

if (!CreatePipe(&Entrada_Rd, &Entrada_Wr, &sa, 0))
    // Handle error

if (!SetHandleInformation(Entrada_Wr, HANDLE_FLAG_INHERIT, 0))
    // Handle error

PROCESS_INFORMATION pi;
STARTUPINFOW si;

ZeroMemory(&pi, sizeof pi);
ZeroMemory(&si, sizeof si);

si.cb = sizeof si;
si.hStdError = Saida_Wr;
si.hStdOutput = Saida_Wr;
si.hStdInput = Entrada_Rd;
si.dwFlags |= STARTF_USESTDHANDLES;

// Use CreateProcessW with wide character command
res = CreateProcessW(nullptr, ptrRespTerm, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &si, &pi);

if (res) {
    // Process created successfully
    // You can interact with the process using Entrada_Wr and Saida_Rd

    // Close handles when done
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(Saida_Rd);
    CloseHandle(Saida_Wr);
    CloseHandle(Entrada_Rd);
    CloseHandle(Entrada_Wr);
} else {
    // Handle error
}

return 0;

}

© www.soinside.com 2019 - 2024. All rights reserved.