簡體   English   中英

無法從C ++ Win32程序連接到命名管道

[英]Having trouble connecting to named pipe from a C++ win32 program

我有兩個在同一台計算機上運行的程序,我需要他們談談。 一個是使用較舊的Windows32框架以C ++編寫的現有程序。 另一個是使用.NET框架的新編寫的C#應用​​程序。 我較新的.NET應用程序將充當服務器,而較舊的現有應用程序將充當客戶端。

我在客戶端和服務器上都創建了命名管道。 我只是無法讓他們連接。 我懷疑問題只是因為我沒有正確匹配文件名(命名管道在后台使用文件)。

這是.NET服務器代碼:

    private volatile NamedPipeServerStream pipeServer;
    pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
    pipeServer.WaitForConnection();

這是較舊的現有win32客戶端代碼:

HANDLE pipe = CreateFile(
    "\\Device\\NamedPipe\\MyPipe",
    GENERIC_READ | GENERIC_WRITE, // only need read access
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL
);

我先運行服務器代碼,然后坐在那里等待連接。 每當我的句柄等於INVALID_HANDLE_VALUE

我使用ProcessExplorer來查看是否可以找到管道的真實名稱。 根據ProcessExplorer的名稱為\\ Device \\ NamedPipe \\ MyPipe

我認為我在客戶方面與此匹配。 如果有人可以提出建議,我將不勝感激。 謝謝。

要使用CreateFile打開命名管道,您需要將文件名指定為\\\\.\\pipe\\name ,因此在您的情況下,它看起來像:

HANDLE pipe = CreateFile(
    "\\\\.\\Pipe\\MyPipe",
    GENERIC_READ | GENERIC_WRITE, // only need read access
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL
);

設置PipeSecurity為我解決了這個問題。 使Everyone可以訪問它看起來不太安全,但是可以正常工作。

PipeSecurity ps = new PipeSecurity();
PipeAccessRule psRule = new PipeAccessRule(@"Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(psRule);
 NamedPipeServerStream pipeServer = new NamedPipeServerStream("datapipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 1, 1, ps);

源: 命名管道錯誤-System.UnauthorizedAccessException:拒絕訪問路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM