Win32 API中是否存在与Linux / Unix stdio.h popen()函数大致相同的内容?如果是这样,我在哪里可以找到它?
编辑:我需要知道这一点来修补D标准库中的遗漏。任何答案都必须使用仅标准的Win32 API,而不是MSVC特定的功能。另外,如果存在的话,我更喜欢低级别的东西。
答案 0 :(得分:20)
MSDN解释了如何在Pipe Handle Inheritance中使用Windows API执行popen所做的工作。 Here它提供了一个记录良好的例子。它比Jason链接的运行时库中的_popen
函数更低级,但仅使用Win32 API。
答案 1 :(得分:17)
如果您正在编写控制台应用程序,则可以调用_popen
。有关详细信息,请参阅MSDN站点上的文档:http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx
答案 2 :(得分:4)
可悲的是,这并不是特别容易。
您需要使用win32函数(CreatePipe)创建管道,然后通常需要复制您为子进程提供的管道末尾(DuplicateHandle)以允许它继承,否则它赢了“ t be因此无法使用。
然后你需要使用CreateProcess创建一个进程(它需要很多结构指针,包括一个STARTUPINFO),并将你已复制的句柄传递给STARTUPINFO作为其标准输出。
然后你可以从管道的读取端(ReadFile等)读取,直到你到达eof,然后你需要通过关闭所有各种win32句柄进行清理。
答案 3 :(得分:1)
挖掘旧线程......
对Jason Coco上面的回复做出反应,与链接的MSDN页面声称的相反,现在显然有可能从非控制台应用程序调用_popen()。我从QuickTime导入器组件调用它,基本上是伪装的DLL。它会打开一个控制台窗口,但会显示预期的行为。使用mingw32的-mwindows选项编译标准控制台工具以使其成为GUI应用程序,_popen继续正常工作(但即使从另一个控制台运行该工具,也会打开控制台窗口。
答案 4 :(得分:1)
这是一篇旧文章,但几年前,我还需要在Windows环境中使用类似popen()的调用。正如这里答案中的一些评论所指出的那样,使用Windows API实现接近经典POSIX popen()
的任何事物都是很有趣的。
我创建了一个提交给Code Review 的实现。此实现使用pipes
到stdin
以及从stdout
开始使用CreateProcess(...)
的Windows方法。
链接的代码旨在通过很小的API内置到dll中。
int __declspec(dllexport) cmd_rsp(const char *command, char **chunk, unsigned int size);
简单用法示例:
#include "cmd_rsp.h"
int main(void)
{
char *buf = {0};
buf = calloc(100, 1);
if(!buf)return 0;
cmd_rsp("dir /s", &buf, 100);
printf("%s", buf);
free(buf);
//or a custom exe
char *buf2 = {0};
buf2 = calloc(100, 1);
cmd_rsp("some_custom_program.exe arg_1 arg_2 arg_n", &buf2, 100);
printf("%s", buf2);
free(buf2);
return 0;
}
它接受例如可以从stdin
发出的任何命令,创建一个单独的过程来执行该命令,然后将所有响应内容(如果有)返回到缓冲区,并且执行此操作而不显示CMD窗口弹出。缓冲区会根据需要增长,以适应响应的大小。