使用WM_COPYDATA消息进行C++进程和C#进程发送结构体

本文展示了如何在C#服务端和C++客户端之间通过WM_COPYDATA消息传递自定义结构体。首先在C#中定义并转换结构体为字节数组,然后使用SendMessage发送。C++接收端接收到消息后,解析COPYDATASTRUCT中的数据恢复结构体内容。
摘要由CSDN通过智能技术生成

背景

  1. 我的服务端是一个C#进程;
  2. 我的客户端是一个C++进程;
  3. 我需要C#进程给C++发送结构体。

代码

C#代码

namespace Server
{
 	public partial class MainWindow : Window
 	{
 	    [DllImport("user32.dll")]
        private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, ref COPYDATASTRUCT lParam);
        
 		// 1. 定义结构体
        [StructLayout(LayoutKind.Sequential)]
        public struct PWGREENLINESTRUCT
        {
            // 图像顶点
            public double x;
            public double y;
        }

		// 将结构体转换成byte数组,方便发送和解析
        private byte[] StructToBytes(object anyStruct)
        {
            int size = Marshal.SizeOf(anyStruct);
            IntPtr bytesPtr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(anyStruct, bytesPtr, false);
            byte[] bytes = new byte[size];
            Marshal.Copy(bytesPtr, bytes, 0, size);
            Marshal.FreeHGlobal(bytesPtr);

            return bytes;
        }
        
		public void SendMessage()
		{
			// 2. 结构体赋值
			PWGREENLINESTRUCT _struct = new PWGREENLINESTRUCT();
			_struct.x = 10.0f;
			_struct.y = 20.0f;
	
			// 3. 将结构体转换成字节数组
			var structBytes = StructToBytes(_struct);

			// 4. 准备COPYDATA结构体
			COPYDATASTRUCT pw_struct;
			pw_struct.dwData = (IntPtr)0;								// 用以标记受到的COPYDATA类型
			pw_struct.cbData = structBytes.Length;						// 用以标记数据长度
			
			// 4.1 开启空间以存储数据
			pw_struct.lpData = Marshal.AllocHGlobal(pw_struct.cbData);
			
			// 4.2 将结构体字节数组拷贝到COPYDATA空间中
			Marshal.Copy(structBytes, 0, pw_struct.lpData, structBytes.Length);

			// 4.3 发送数据
            SendMessage(proxyHandle, WM_COPYDATA, 0, ref pw_struct);	// proxyHandle,C++进程的进程句柄

			// 4.4 释放内存
			Marshal.FreeHGlobal(pw_struct.lpData);
		}

    }
}

C++代码

// 声明消息映射
BEGIN_MESSAGE_MAP(CDlgPalmProbe, CDialogEx)
	ON_WM_COPYDATA()
END_MESSAGE_MAP()

struct PWGREENLINESTRUCT
{
	double _x = 0;
	double _y = 0;
}

BOOL CDlgPalmProbe::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	if (pCopyDataStruct)
	{
		if (pCopyDataStruct->dwData == 0)
		{
			unsigned char* pSource = (unsigned char*)(pCopyDataStruct->lpData);
			
			PWGREENLINESTRUCT _struct;
			memcpy(&_struct, (PWGREENLINESTRUCT*)pSource, sizeof(PWGREENLINESTRUCT));

			printf("x = %f, y = %f\n", _struct._x, _struct._y);
		}
	}
}

注意

  1. 传输图像或者其它数据也是一样的,想办法将数据转换成byte[],然后按照上述方法传输即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值