C 创建控制台管道而不是文件管道
我试图在运行命令时从cmd.exe捕获输出。我试图捕获Unicode输出以支持其他语言。我的代码现在可以将unicode从内置命令恢复到cmd.exe。例如Dir。但如果我尝试运行外部命令,如“net user”或“ipconfig”,它不会输出unicode 我读了一遍,发现这是因为我的管道是文件管道。Ipconfig.exe确定它是否正在打印到控制台。如果打印到控制台,则使用WriteFileW并输出unicode。否则它只会打印ANSI,我会得到什么????????任何东西都可以C 创建控制台管道而不是文件管道,c,windows,C,Windows,我试图在运行命令时从cmd.exe捕获输出。我试图捕获Unicode输出以支持其他语言。我的代码现在可以将unicode从内置命令恢复到cmd.exe。例如Dir。但如果我尝试运行外部命令,如“net user”或“ipconfig”,它不会输出unicode 我读了一遍,发现这是因为我的管道是文件管道。Ipconfig.exe确定它是否正在打印到控制台。如果打印到控制台,则使用WriteFileW并输出unicode。否则它只会打印ANSI,我会得到什么????????任何东西都可以 #inc
#include <winsock.h>
#include <Windows.h>
#include <stdio.h>
void ExecCmd() {
HANDLE hPipeRead;
HANDLE hPipeWrite;
SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES) };
STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = { 0 };
BOOL fSuccess;
BOOL bProcessEnded = FALSE;
size_t total = 0;
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
if (!CreatePipe(&hPipeRead, &hPipeWrite, &saAttr, 0)) {
return;
}
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdOutput = hPipeWrite;
si.hStdError = hPipeWrite;
si.wShowWindow = SW_HIDE;
WCHAR k[] = L"cmd.exe /u /c net user";
fSuccess = CreateProcessW(NULL, k, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (!fSuccess) {
CloseHandle(hPipeWrite);
CloseHandle(hPipeRead);
return;
}
for (; !bProcessEnded;) {
bProcessEnded = WaitForSingleObject(pi.hProcess, 50) == WAIT_OBJECT_0;
while (TRUE) {
DWORD dwRead = 0;
DWORD dwAvail = 0;
WCHAR *buffer = NULL;
if (!PeekNamedPipe(hPipeRead, NULL, NULL, NULL, &dwAvail, NULL)) {
break;
}
if (!dwAvail) {
break;
}
buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (dwAvail + 2));
if (buffer == NULL) {
break;
}
if (!ReadFile(hPipeRead, buffer, dwAvail, &dwRead, NULL) || !dwRead) {
break;
}
total += dwRead;
}
}
CloseHandle(hPipeWrite);
CloseHandle(hPipeRead);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return;
}
int main() {
ExecCmd();
return 0;
}
#包括
#包括
#包括
void ExecCmd(){
处理HPiperread;
处理hpipebrite;
安全属性saAttr={sizeof(安全属性)};
STARTUPINFO si={sizeof(STARTUPINFO)};
进程信息pi={0};
成功;
BOOL bProcessEnded=FALSE;
总尺寸=0;
saAttr.bInheritHandle=TRUE;
saAttr.lpSecurityDescriptor=NULL;
如果(!CreatePipe(&hPipeRead,&HPIPERWRITE,&saAttr,0)){
返回;
}
si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdOutput=hpipebrite;
si.hStdError=hpipebwrite;
si.wShowWindow=SW_HIDE;
WCHAR k[]=L“cmd.exe/u/c网络用户”;
fSuccess=CreateProcessW(NULL,k,NULL,NULL,NULL,TRUE,CREATE\u NEW\u控制台,NULL,NULL,&si,&pi);
如果(!fsucces){
CloseHandle(hPipeWrite);
闭合手柄(hPipeRead);
返回;
}
对于(;!bProcessEnded;){
bProcessEnded=WaitForSingleObject(pi.hProcess,50)=WAIT_OBJECT_0;
while(TRUE){
DWORD dwRead=0;
DWORD dwAvail=0;
WCHAR*buffer=NULL;
if(!PeekNamedPipe(hPipeRead,NULL,NULL,NULL,&dwAvail,NULL)){
打破
}
如果(!dwAvail){
打破
}
buffer=HeapAlloc(GetProcessHeap(),HEAP_ZERO_内存,(dwAvail+2));
if(buffer==NULL){
打破
}
如果(!ReadFile(hPipeRead,buffer,dwAvail,&dwRead,NULL)| |!dwRead){
打破
}
总+=dwRead;
}
}
CloseHandle(hPipeWrite);
闭合手柄(hPipeRead);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
返回;
}
int main(){
ExecCmd();
返回0;
}
我的问题是如何改变管道从外部命令(如ipconfig)获取信息的方式,使其支持unicode。这里的“控制台管道”真的是正确的术语吗?我认为您需要实际分配一个新的控制台。我不知道Windows的答案,但在Unix世界中,您可能会说您需要一个新的终端(或者更可能是伪终端或pty)。可能相关:可能相关:这里的“控制台管道”真的是正确的术语吗?我认为您需要实际分配一个新的控制台。我不知道Windows的答案,但在Unix世界中,您可能会说您需要一个新的终端(或者更可能是伪终端或pty)。可能相关:可能相关: