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