【发布时间】:2013-12-13 17:56:13
【问题描述】:
我在将双精度数组从一个应用程序发送到另一个应用程序时遇到问题(均为 c#)。
我尝试像这样格式化CopyData Struct:
[StructLayout(LayoutKind.Sequential)]
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.R8)]
public double[] lpData;
}
在Sender Application 我这样填充结构:
double[] a = new double[2] { 1.0, 2.0 };
int size = Marshal.SizeOf(typeof(double)) * a.Count();
CopyDataStruct copyDataStruct;
copyDataStruct.dwData = IntPtr.Zero;
copyDataStruct.lpData = a;
copyDataStruct.cbData = size;
int result = SendMessage(hWnd, WM_COPYDATA, 0, ref copyDataStruct);
在Receiver Application,我试试这个:
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case (int)WINMESSAGES.WM_COPYDATA:
CopyDataStruct cp = (CopyDataStruct)Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
break;
}
return IntPtr.Zero;
}
但在cp.lpDat中,值来自null。不知道是发错了还是收错了。请帮忙,谢谢。
【问题讨论】:
-
获取 null 很难解释,但它不能像声明的那样工作。 PtrToStructure() 无法计算出数组有多大。将
SizeConst = 2添加到 [MarshalAs] 属性并重试。 -
谢谢汉斯。我试过这个,在接收器中我得到一个双数组,索引 0 中的数字非常低(cp.lpData[0] = 2.0760134663004284E-305),索引 1 中的数字非常高(cp.lpData[1] = 6.6028210135419114E +260)。
-
您对 SendMessage() 的声明是错误的,第三个参数是 IntPtr,而不是 int。
-
[DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage(int hWnd, int Msg, int wParam, ref CopyDataStruct lParam);这适用于单个值(字符串、双精度)。我不能让它只适用于数组。再次感谢汉斯。
标签: c# sendmessage wm-copydata