Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建控制台管道而不是文件管道_C_Windows - Fatal编程技术网

C 创建控制台管道而不是文件管道

C 创建控制台管道而不是文件管道,c,windows,C,Windows,我试图在运行命令时从cmd.exe捕获输出。我试图捕获Unicode输出以支持其他语言。我的代码现在可以将unicode从内置命令恢复到cmd.exe。例如Dir。但如果我尝试运行外部命令,如“net user”或“ipconfig”,它不会输出unicode 我读了一遍,发现这是因为我的管道是文件管道。Ipconfig.exe确定它是否正在打印到控制台。如果打印到控制台,则使用WriteFileW并输出unicode。否则它只会打印ANSI,我会得到什么????????任何东西都可以 #inc

我试图在运行命令时从cmd.exe捕获输出。我试图捕获Unicode输出以支持其他语言。我的代码现在可以将unicode从内置命令恢复到cmd.exe。例如Dir。但如果我尝试运行外部命令,如“net user”或“ipconfig”,它不会输出unicode

我读了一遍,发现这是因为我的管道是文件管道。Ipconfig.exe确定它是否正在打印到控制台。如果打印到控制台,则使用WriteFileW并输出unicode。否则它只会打印ANSI,我会得到什么????????任何东西都可以

#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)。可能相关:可能相关: