C# 使用SendMessage WM_COPYDATA发送双数组
我在将双数组从一个应用程序发送到另一个应用程序时遇到了问题 我尝试按如下方式格式化CopyData结构:C# 使用SendMessage WM_COPYDATA发送双数组,c#,sendmessage,wm-copydata,C#,Sendmessage,Wm Copydata,我在将双数组从一个应用程序发送到另一个应用程序时遇到了问题 我尝试按如下方式格式化CopyData结构: [StructLayout(LayoutKind.Sequential)] public struct CopyDataStruct { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.ByValArray, ArraySubType =
[StructLayout(LayoutKind.Sequential)]
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.R8)]
public double[] lpData;
}
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);
在Sender应用程序中,我按如下方式填充结构:
[StructLayout(LayoutKind.Sequential)]
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.R8)]
public double[] lpData;
}
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);
在接收器应用程序中,我尝试以下方法:
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.lpData中,值为空。我不知道我是发错了还是收错了。请帮助,谢谢。您需要使用本机内存。像那样通过C双[]是行不通的。它将被垃圾收集,而且,它甚至没有在C中分配-它只是在堆栈中。您可以使用不安全/固定关键字锁定对象,也可以使用AllocHGlobal 这是我从互联网上窃取的一些代码。演示发送部分:
// Marshal the managed struct to a native block of memory.
var myStruct = new double[2] { 1.0, 2.0 };
int myStructSize = Marshal.SizeOf(myStruct);
IntPtr pMyStruct = Marshal.AllocHGlobal(myStructSize);
try
{
Marshal.StructureToPtr(myStruct, pMyStruct, true);
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds.cbData = myStructSize;
cds.lpData = pMyStruct;
// Send the COPYDATASTRUCT struct through the WM_COPYDATA message to
// the receiving window. (The application must use SendMessage,
// instead of PostMessage to send WM_COPYDATA because the receiving
// application must accept while it is guaranteed to be valid.)
NativeMethod.SendMessage(hTargetWnd, WM_COPYDATA, this.Handle, ref cds);
int result = Marshal.GetLastWin32Error();
if (result != 0)
{
MessageBox.Show(String.Format(
"SendMessage(WM_COPYDATA) failed w/err 0x{0:X}", result));
}
}
finally
{
Marshal.FreeHGlobal(pMyStruct);
}
take:获取null很难解释,但它不能像声明的那样工作。PtrToStructure无法计算阵列的大小。将SizeConst=2添加到[Marshallas]属性,然后重试。谢谢。我尝试了这个方法,在Receiver中我得到了一个双数组,索引0 cp.lpData[0]=2.0760134663004284E-305中的数字非常低,索引1 cp.lpData[1]=6.6028210135419114E+260中的数字非常高。SendMessage的声明是错误的,第三个参数是IntPtr,而不是int。[DllImportUser32.dll,EntryPoint=SendMessage]公共静态外部int sendmagesint hWnd、int Msg、int wParam、ref CopyDataStruct lParam;这适用于个人价值观弦乐,双打。我不能让它只适用于阵列。再次谢谢你,汉斯。谢谢你的回答。在Marshal.structurettrmystruct中,pmystuct为true;我有一个错误,指定的结构必须是飞航或布局信息。有什么想法吗?