Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在将通过WM_COPYDATA接收到的C结构编组到C结构时,过程退出_C#_C_Struct_Marshalling_Wm Copydata - Fatal编程技术网

C# 在将通过WM_COPYDATA接收到的C结构编组到C结构时,过程退出

C# 在将通过WM_COPYDATA接收到的C结构编组到C结构时,过程退出,c#,c,struct,marshalling,wm-copydata,C#,C,Struct,Marshalling,Wm Copydata,这是我的问题。我正在尝试将C结构编组为C#结构。C结构通过WM_COPYDATA消息从C应用程序发送到C#应用程序。发送和确认消息不是问题,而且工作非常正常 我在debug中运行C应用程序,将另一个调试器附加到C#应用程序并发送消息。它被正确地接收和识别,但当我尝试封送数据时,marshal.PtrToStructure函数似乎在执行其余语句之前退出switch语句(请参见代码中的标记行) 因此,不会执行过程manageComplexMessage,数据仍为原始数据且不可用 这是我在C#中使用的

这是我的问题。我正在尝试将C结构编组为C#结构。C结构通过WM_COPYDATA消息从C应用程序发送到C#应用程序。发送和确认消息不是问题,而且工作非常正常

我在debug中运行C应用程序,将另一个调试器附加到C#应用程序并发送消息。它被正确地接收和识别,但当我尝试封送数据时,marshal.PtrToStructure函数似乎在执行其余语句之前退出switch语句(请参见代码中的标记行)

因此,不会执行过程
manageComplexMessage
,数据仍为原始数据且不可用

这是我在C#中使用的CopyDataStruct:

这是我在C#中用于存储通过WM#U 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;
    }
}
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;
}
我在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
};  
最后,发送消息的过程:

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;
    }
}
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;
}
当我封送字符串数组时,我怀疑有问题,但我找不到问题

谢谢大家的帮助!我希望有人能告诉我哪里错了,或者给我指出正确的方向


编辑:经过更多测试后,结构的整数部分和双精度部分工作正常。如果我发送一个字符串,它也可以工作。它只有在我尝试发送字符串数组时才会崩溃。问题就出在我的字符串数组的MarshalAs语句中,但我仍然无法找到正确的写入方法。

字符串数组可以表示为
char[256*25]
。我想这是可行的。如果我找不到其他东西,我可能会这么做谢谢!字符串数组的可能副本可以表示为
char[256*25]
。我想这会有用的。如果我找不到其他东西,我可能会这么做谢谢!可能重复的