Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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#中为SendMessage编组结构_C#_Struct_Marshalling_Sendmessage - Fatal编程技术网

如何在C#中为SendMessage编组结构

如何在C#中为SendMessage编组结构,c#,struct,marshalling,sendmessage,C#,Struct,Marshalling,Sendmessage,我定义了两个结构(一个接一个),如下所示: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)] public struct tagRCV_FILE_HEADEx { public int m_dwLen; [MarshalAs(UnmanagedType.ByValArra

我定义了两个结构(一个接一个),如下所示:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct tagRCV_FILE_HEADEx
{                      
    public int m_dwLen;                                     
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
    public byte[] m_szFileName;                        
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct tagRCV_DATA
{
    public int m_nPacketNum;                                        
    [MarshalAs(UnmanagedType.Struct)]
    public tagRCV_FILE_HEADEx m_File;                                 
}
我是这样初始化的:

tagRCV_DATA rcv_data = new tagRCV_DATA ();
rcv_data.m_File = new tagRCV_FILE_HEADEx();
rcv_data.m_File.m_szFileName = new byte[260];    
rcv_data.m_nPacketNum = 1;
下面是我如何编组和调用SendMessage的:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, uint Msg, int wParam, IntPtr lParam); 

// let's say hwnd, Msg and RCV_REPORT are known parameters
IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(rcv_data));
Marshal.StructureToPtr(rcv_data,lParam, false);
SendMessage(hwnd, Msg, RCV_REPORT, lParam);
Marshal.PtrToStructure(lParam, rcv_data);
Marshal.FreeHGlobal (lParam);

当我运行它时,它崩溃了。有人能看出我做错了什么吗?提前谢谢

当它崩溃时,有没有给你一个错误?没有错误。只是静静地坠毁了。如果我注释掉SendMessage语句,则不会发生崩溃。因此,这与SendMessage有关。第三个参数是IntPtr,而不是int。您不能向另一个进程拥有的窗口发送指针。指针仅在创建它的进程内有效。拥有该窗口的应用程序在尝试取消引用指针时将以访问冲突进行轰炸。一种解决方法是使用WM_COPYDATA或使用VirtualAllocEx()在目标进程中分配内存。@Hans Passant I将第三个参数更改为IntPtr,它仍然崩溃。我尝试了Andreas Reiff使用VirtualAllocEx的通用SendMessage[link](“”),但结果是一样的。我想确保我的struct init做得正确。还有一件事,当我为rcv_data.m_File.m_szFileName赋值时,我做了如下操作:string name=“somename”;System.Text.Encoding.ASCII.GetBytes(name.tocharray(),0,name.Length,rcv_data.m_File.m_szFileName,0);我做得对吗?我建议在调用PtrToStructure时捕获异常-使用try-and-catch-这至少会告诉您发生了什么。