如何在单个应用程序上使用win32管道

时间:2015-02-12 11:25:02

标签: c++ winapi pipe

我试图写入我在本地创建的管道(在同一个应用程序中)
目前我有这个:

audioPipe = CreateNamedPipe(
    L"\\\\.\\pipe\\audioPipe", // name of the pipe
    PIPE_ACCESS_OUTBOUND, // 1-way pipe -- send only
    PIPE_TYPE_MESSAGE, // send data as a byte stream
    1, // only allow 1 instance of this pipe
    0, // no outbound buffer
    0, // no inbound buffer
    0, // use default wait time
    NULL // use default security attributes
);

我不知道如何实际向其写入数据。我想使用WriteFile()但还有更多吗?我阅读的所有示例似乎都使用客户端 - 服务器系统而我并不需要。我只需要将数据写入管道(所以ffmpeg会把它拿起来,希望如此)

2 个答案:

答案 0 :(得分:2)

根据评论,您正在创建命令行FFMPEG应用程序将连接到的命名管道。为了实现这一点,您需要做三件事:

  1. 将您的通话更改为CreateNamedPipe()以使用PIPE_TYPE_BYTE代替PIPE_TYPE_MESSAGE,因为您将原始数据直播到FFMPEG,而不是消息。这将允许FFMPEG使用它想要的任意缓冲区等从管道读取数据,就好像它是直接从真实文件中读取一样。

    audioPipe = CreateNamedPipe(
        L"\\\\.\\pipe\\audioPipe", // name of the pipe
        PIPE_ACCESS_OUTBOUND, // 1-way pipe -- send only
        PIPE_TYPE_BYTE, // send data as a byte stream
        1, // only allow 1 instance of this pipe
        0, // no outbound buffer
        0, // no inbound buffer
        0, // use default wait time
        NULL // use default security attributes
    );
    
  2. 您需要先调用ConnectNamedPipe()接受来自FFMPEG的连接,然后才能向其写入数据。

    ConnectNamedPipe(audioPipe, NULL);
    
  3. 运行FFMPEG时,使用-i参数将管道名称指定为输入文件名,例如:ffmpeg -i \\.\pipe\audioPipe

答案 1 :(得分:1)

除了致电WriteFile之外,没有其他事情了。在调用ConnectNamedPipe之前,您还需要调用WriteFile以等待客户端连接。

客户端通过打开CreateFile的句柄然后使用ReadFile进行阅读来从管道中读取。

对于字节流,您需要PIPE_TYPE_BYTE。您确定要为缓冲区大小指定0吗?