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

背景

  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[],然后按照上述方法传输即可。

猜你喜欢

转载自blog.csdn.net/A_water_/article/details/129853349