c++进程和C#进程之间利用命名管道通信的问题
我最近一直在琢磨C#和c++之间利用命名管道通信进行进程通信的问题。有几个个问题困扰了我很久,一直没有得到解决:
1. c++命名管道之间数据传递是否只能通过字符串形式来传递?如果是int[]数组该怎么传?
看msdn以及网上众多的例子,命名管道通信,都只是传递一个简单的字符串,如果传递的是一个非常大的整形数组怎么传?比如说int[10000]该怎么传?
发送端: char szMsg[80] = "test string!\n";
DWORD dwSize = 80, dwBytesWritten = 0;
BOOL ret = FALSE;
ret = ::WriteFile(hPipe, szMsg, strlen(szMsg) + 1, &dwBytesWritten, NULL);
ShowInfo("发送完毕,\r\n");
接收端: char szMsg[80] = "";
DWORD dwSize = 80, dwBytesRead = 0;
ret = ReadFile(dlg->hPipe, szMsg, dwSize, &dwBytesRead, NULL);
这样没有问题。
但是如果将传递的数据改为int[]数组,如int szMsg[80] = {1,2,3,4,5,6},就不行了?
通过char[]形式传递指针,通过int[]也是传递指针,但为什么就行不通呢?
int[]数组该怎么传?
2. c#中命名管道之间数据传递是否只能用byte[]字节数组的形式来传递呢?
在C#中调用API:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(
IntPtr hHandle, // handle to file
byte[] lpBuffer,// data buffer
uint nNumberOfBytesToWrite, // number of bytes to write
byte[] lpNumberOfBytesWritten, // number of bytes written
uint lpOverlapped // overlapped buffer
);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadFile(
IntPtr hHandle, // handle to file
byte[] lpBuffer,// data buffer
uint nNumberOfBytesToRead,// number of bytes to read
byte[] lpNumberOfBytesRead,// number of bytes read
uint lpOverlapped// overlapped buffer
);
如果将传递的数据以byte[]的形式传递,两个进程之间通信没有任何问题。
但是,如果将上面WriteFile和ReadFile中的byte[]改成cahr[]形式:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(
IntPtr hHandle, // handle to file
char[] lpBuffer,// data buffer
uint nNumberOfBytesToWrite, // number of bytes to write
char[] lpNumberOfBytesWritten, // number of bytes written
uint lpOverlapped // overlapped buffer
);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadFile(
IntPtr hHandle, // handle to file
char[] lpBuffer,// data buffer
uint nNumberOfBytesToRead,// number of bytes to read
char[] lpNumberOfBytesRead,// number of bytes read
uint lpOverlapped// overlapped buffer
);
将要传递的数据转换成char[]的形式来传递,两个进程就不能通信了。就是在发送端WriteFile能够发送出去,接收端ReadFile不能读出数据。
我尝试过用c#发送数据char[]形式或者string,在c++端都能够接收,只是c#端却不能接收。
c#中命名管道之间数据传递是否只能用byte[]字节数组的形式来传递呢?
3. 综上,命名管道到底是以何种方式传递数据?字节吗?
CreateNamedPipeA(
LPCSTR lpName,
DWORD dwOpenMode,//duplex, inbound, or outbound)
DWORD dwPipeMode,//byte-type or message-type)
DWORD nMaxInstances,//最大的管道实例数目
DWORD nOutBufferSize,//
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
其中第三个参数dwPipeMode决定了管道中数据的传递方式byte-type or message-type。字节模式和消息模式分别是以什么形式来传递数据呢?
恳请您给我解答,谢谢!
1. c++命名管道之间数据传递是否只能通过字符串形式来传递?如果是int[]数组该怎么传?
看msdn以及网上众多的例子,命名管道通信,都只是传递一个简单的字符串,如果传递的是一个非常大的整形数组怎么传?比如说int[10000]该怎么传?
发送端: char szMsg[80] = "test string!\n";
DWORD dwSize = 80, dwBytesWritten = 0;
BOOL ret = FALSE;
ret = ::WriteFile(hPipe, szMsg, strlen(szMsg) + 1, &dwBytesWritten, NULL);
ShowInfo("发送完毕,\r\n");
接收端: char szMsg[80] = "";
DWORD dwSize = 80, dwBytesRead = 0;
ret = ReadFile(dlg->hPipe, szMsg, dwSize, &dwBytesRead, NULL);
这样没有问题。
但是如果将传递的数据改为int[]数组,如int szMsg[80] = {1,2,3,4,5,6},就不行了?
通过char[]形式传递指针,通过int[]也是传递指针,但为什么就行不通呢?
int[]数组该怎么传?
2. c#中命名管道之间数据传递是否只能用byte[]字节数组的形式来传递呢?
在C#中调用API:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(
IntPtr hHandle, // handle to file
byte[] lpBuffer,// data buffer
uint nNumberOfBytesToWrite, // number of bytes to write
byte[] lpNumberOfBytesWritten, // number of bytes written
uint lpOverlapped // overlapped buffer
);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadFile(
IntPtr hHandle, // handle to file
byte[] lpBuffer,// data buffer
uint nNumberOfBytesToRead,// number of bytes to read
byte[] lpNumberOfBytesRead,// number of bytes read
uint lpOverlapped// overlapped buffer
);
如果将传递的数据以byte[]的形式传递,两个进程之间通信没有任何问题。
但是,如果将上面WriteFile和ReadFile中的byte[]改成cahr[]形式:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(
IntPtr hHandle, // handle to file
char[] lpBuffer,// data buffer
uint nNumberOfBytesToWrite, // number of bytes to write
char[] lpNumberOfBytesWritten, // number of bytes written
uint lpOverlapped // overlapped buffer
);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadFile(
IntPtr hHandle, // handle to file
char[] lpBuffer,// data buffer
uint nNumberOfBytesToRead,// number of bytes to read
char[] lpNumberOfBytesRead,// number of bytes read
uint lpOverlapped// overlapped buffer
);
将要传递的数据转换成char[]的形式来传递,两个进程就不能通信了。就是在发送端WriteFile能够发送出去,接收端ReadFile不能读出数据。
我尝试过用c#发送数据char[]形式或者string,在c++端都能够接收,只是c#端却不能接收。
c#中命名管道之间数据传递是否只能用byte[]字节数组的形式来传递呢?
3. 综上,命名管道到底是以何种方式传递数据?字节吗?
CreateNamedPipeA(
LPCSTR lpName,
DWORD dwOpenMode,//duplex, inbound, or outbound)
DWORD dwPipeMode,//byte-type or message-type)
DWORD nMaxInstances,//最大的管道实例数目
DWORD nOutBufferSize,//
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
其中第三个参数dwPipeMode决定了管道中数据的传递方式byte-type or message-type。字节模式和消息模式分别是以什么形式来传递数据呢?
恳请您给我解答,谢谢!
...全文
相关推荐
命名管道的用法,搜集整理于网络
命名管道的用法,搜集整理于网络。要1分以示鼓励。
C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes)
在 C# 和 C++ 应用程序之间进行数据交换时,命名管道(Named Pipes)是一种简单高效的进程间通信(IPC)方式。命名管道提供了可靠的双向通信通道,适合用于同一台机器上的跨进程通信。本文将深入介绍如何在 C# 和 C++ 程序中使用命名管道进行数据传输,包括详细的示例代码,帮助读者在实践中使用并调试这一技术。命名管道是 Windows 提供的一种 IPC 机制,支持双向数据流。与匿名管道不同,命名管道可以跨进程、跨用户访问。
从非托管进程执行PowerShell_C_C#_下载.zip
从非托管进程执行PowerShell_C_C#_下载.zip
DocsVision Remoting-开源
具有完全以C#编写的具有安全支持(通过SSPI)的自定义.NET远程处理通道(命名管道,TCP)。 还包括使用C ++编写的自定义二进制格式器和非托管客户端。
测试unity通信wpf.rar
测试unity通信wpf项目demo ,需要的同学下载,研究一下。仅供分享,谢谢下载


