gpt4 book ai didi

c - Windows CreateProcess 和输出重定向

转载 作者:行者123 更新时间:2023-11-30 17:03:44 27 4
gpt4 key购买 nike

我正在使用 WinAPI 的 Windows 环境中的 C 项目中工作。我的函数执行作为参数接收的命令(例如:“dir C:\Users”),并返回其输出。
它是从 DLL 运行的,因此它不能生成 cmd.exe 窗口,这意味着我无法使用 _popen。所以我使用 CreateProcessA 和一个管道来捕获 stdout。

这是代码:

char *runExec(char *command, int *contentLen) {
char *ret=NULL,*tmp=NULL;
DWORD readBytes;
int size=0;
char buffer[128],cmdBuf[4096];
HANDLE StdOutHandles[2];

CreatePipe(&StdOutHandles[0], &StdOutHandles[1], NULL, 4096);

STARTUPINFOA si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdOutput = StdOutHandles[1];
si.hStdError = StdOutHandles[1];
PROCESS_INFORMATION pi;

snprintf(cmdBuf,4096,"cmd /C %s", command);
if (!CreateProcessA(NULL, cmdBuf, NULL, NULL, FALSE, CREATE_NO_WINDOW | DETACHED_PROCESS, NULL, NULL, &si, &pi)) {
printf("Error createProcess : %d\n",GetLastError());
return NULL;
}


CloseHandle(StdOutHandles[1]);
printf("Before read\n");
while (ReadFile(StdOutHandles[0], buffer, 127, &readBytes, NULL)){
printf("IN WHILE\n");
buffer[readBytes] = 0;
printf("read %d bytes\n", readBytes);
size += readBytes;
tmp = (char *)realloc(ret, size + 1);
if (tmp == NULL) {
free(ret);
return NULL;
}
ret = tmp;
strncpy(ret + (size - readBytes), buffer, readBytes);
ret[size] = 0;
}
printf("Readfile returned with %d, read %d\n", GetLastError(),readBytes);

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(StdOutHandles[0]);
printf("#%s#\n", ret);

return ret;
}

输出是:

Before read
Readfile returned with 109, read 0
#(null)#

由此我了解到:
- 我的循环甚至没有执行一次
- ReadFile 不读取任何内容并立即返回 Broken Pipe

我已经阅读了各种 stackoverflow 和 MSDN 页面,但我似乎无法使其工作。

最佳答案

正如评论中所指出的,句柄必须是可继承的,这意味着像这样替换 CreatePipe :

SECURITY_ATTRIBUTES pipeAttrib;
memset(&pipeAttrib, 0, sizeof(pipeAttrib));

pipeAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
pipeAttrib.bInheritHandle = NULL;
pipeAttrib.bInheritHandle = TRUE;

if (!CreatePipe(&StdOutHandles[0], &StdOutHandles[1],&pipeAttrib, 4096)) {
printf("Create pipe error %d\n", GetLastError());
return NULL;
}

并将 CreateProcess 第 5 个参数 (bInheritHandles) 设置为 TRUE 而不是 FALSE

关于c - Windows CreateProcess 和输出重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36034476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com