Skip to main content
 首页 » 编程设计

windows之创建命名管道 C++ Windows

2025年02月15日18lyj

我正在尝试在 C++ ( Windows ) 中的 2 个进程之间创建一个简单的通信,例如 linux 中的 FIFO。
这是我的服务器:

int main() 
{ 
    HANDLE pipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ, 0, NULL, OPEN_EXISTING,    FILE_FLAG_OVERLAPPED, NULL); 
    ConnectNamedPipe(pipe, NULL); 
    while(TRUE){ 
        string data; 
        DWORD numRead =1 ; 
        ReadFile(pipe, &data, 1024, &numRead, NULL); 
        cout << data << endl; 
 
} 
    CloseHandle(pipe); 
    return 0; 
} 

这是我的客户:
int main() 
{ 
    HANDLE pipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
    ConnectNamedPipe(pipe, NULL); 
    string message = "TEST"; 
    DWORD numWritten; 
    WriteFile(pipe, message.c_str(), message.length(), &numWritten, NULL); 
    return 0; 
} 

代码不起作用,我如何修复它以喜欢 FIFO?

请您参考如下方法:

您不能通过调用 CreateFile(..) 创建命名管道。 .

看看 pipe examples of the MSDN .由于这些例子非常复杂,我很快就写了一个 非常简单的命名管道服务器和客户端。

int main(void) 
{ 
    HANDLE hPipe; 
    char buffer[1024]; 
    DWORD dwRead; 
 
 
    hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\Pipe"), 
                            PIPE_ACCESS_DUPLEX, 
                            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,   // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
                            1, 
                            1024 * 16, 
                            1024 * 16, 
                            NMPWAIT_USE_DEFAULT_WAIT, 
                            NULL); 
    while (hPipe != INVALID_HANDLE_VALUE) 
    { 
        if (ConnectNamedPipe(hPipe, NULL) != FALSE)   // wait for someone to connect to the pipe 
        { 
            while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) 
            { 
                /* add terminating zero */ 
                buffer[dwRead] = '\0'; 
 
                /* do something with data in buffer */ 
                printf("%s", buffer); 
            } 
        } 
 
        DisconnectNamedPipe(hPipe); 
    } 
 
    return 0; 
} 

这是客户端代码:
int main(void) 
{ 
    HANDLE hPipe; 
    DWORD dwWritten; 
 
 
    hPipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"),  
                       GENERIC_READ | GENERIC_WRITE,  
                       0, 
                       NULL, 
                       OPEN_EXISTING, 
                       0, 
                       NULL); 
    if (hPipe != INVALID_HANDLE_VALUE) 
    { 
        WriteFile(hPipe, 
                  "Hello Pipe\n", 
                  12,   // = length of string + terminating '\0' !!! 
                  &dwWritten, 
                  NULL); 
 
        CloseHandle(hPipe); 
    } 
 
    return (0); 
} 

您应该替换管道名称 TEXT("\\\\.\\pipe\\Pipe")通过位于常用头文件中的#define。