我使用
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 中的文本?
是的,您可以使其使用宽字符(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;
}