这是我的问题。我试图将C结构元素化为C#结构。 C结构通过WM_COPYDATA消息从C应用程序发送到C#应用程序。发送和确认消息不是问题,并且完全正常。
我在调试中运行C应用程序,将另一个调试器附加到C#应用程序并发送消息。它被正确接收和识别但是当我尝试编组数据时,Marshal.PtrToStructure函数似乎在执行其余部分之前退出switch语句(参见代码中标记的行)。
因此,不会执行过程manageComplexMessage
,并且数据仍然是原始且无法使用的。
这是我在C#中使用的CopyDataStruct:
private struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
这是我在C#中用来存储通过WM_COPYDATA发送的数据的结构:
private struct ComplexData
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 75)]
public int[] integers;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 75)]
public double[] doubles;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPStr, SizeConst = 25)]
public string[] strings;
};
处理WM_COPYDATA消息的方法:
protected override void WndProc(ref Message m)
{
int id;
base.WndProc(ref m);
switch (m.Msg)
{
case WM_COPYDATA:
CopyDataStruct rawData = (CopyDataStruct) Marshal.PtrToStructure(m.LParam, typeof(CopyDataStruct)); // This Call to PtrToStructure works perfectly fine.
id = rawData.dwData.ToInt32();
if (Enum.IsDefined(typeof(ComplexMessageId), id))
{
ComplexData data = (ComplexData) Marshal.PtrToStructure(rawData.lpData, typeof(ComplexData)); // This call makes the procedure exit.
manageComplexMessage((ComplexMessageId) id, data);
m.Result = (IntPtr) 1;
}
else
{
m.Result = (IntPtr) 2;
}
break;
}
}
我在C中使用的结构将数据发送到我的C#应用程序:
struct ComplexData {
int Integers[75]; // Maximum 75 integers
double Doubles[75]; // Maximum 75 doubles
char Strings[25][256]; // Maximum 25 strings of a maximum length of 256 characters
};
最后,发送消息的过程:
int SendCopydataMessage(int MessageID, struct ComplexData MessageData)
{
COPYDATASTRUCT DataToSend;
int result;
DataToSend.dwData = MessageID;
DataToSend.cbData = sizeof(MessageData);
DataToSend.lpData = &MessageData;
if(WindowHandle != NULL)
{
result = SendMessage(WindowHandle, WM_COPYDATA, (WPARAM) ((HWND) ExecWnd), (LPARAM) ((PVOID) &DataToSend));
if(!result)
{
return MESSAGENOTPROCESSED;
}
if(result == 2)
{
return UNDEFINEDMESSAGEID;
}
}
return OK;
}
我怀疑在编写Strings数组时遇到问题,但我找不到问题。
谢谢大家的帮助!我希望有人可以告诉我什么是错的,或者指出我朝着正确的方向前进!
编辑:经过更多测试,结构的整数部分和双部分完全正常。此外,如果我发送一个字符串它的工作原理。它只在我尝试发送一个String数组时崩溃。问题是我的MarshalAs语句中的字符串数组,但我仍然无法找到如何正确编写。