比如如下一个结构:(C#中定义)
    [StructLayout(LayoutKind.Sequential)]
    public struct Mydata
    {
        public string str1;
        public string str2;
        public string str3;
        public int str4;
        public bool str5;
    }
结构原形我在Delphi中已经声明,请教各位,如何通过使用WM_COPYDATA消息,在两个程序间传递这个结构???
请大家不吝赐教!!!

解决方案 »

  1.   

    需要指定string 的大小
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
      

  2.   

    public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;        }
      

  3.   

    定义:
       [StructLayout(LayoutKind.Sequential)] 
        public struct Mydata 
        { 
            public string str1; 
            public string str2; 
            public string str3; 
            public int str4; 
            public bool str5; 
        }
    消息结构定义:
        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
    发送消息时我这样写的:
        COPYDATASTRUCT cd1 = new COPYDATASTRUCT();
        Mydata md1 = new Mydata();
        ...........//给md1结构赋值
                  IntPtr Buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(md1));
                Marshal.StructureToPtr(md1,Buffer,false);
                cd1.cbData = Marshal.SizeOf(md1);
                cd1.dwData = Buffer;
                cd1.lpData = Buffer.ToString();//此处我不知道该怎么写???????
      请教,发送还有接收时,应该怎样处理呢?
      

  4.   

    发送方
    public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;        }
            const int WM_COPYDATA = 0x004A;        [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
            int hWnd, // handle to destination window
            int Msg, // message
            int wParam, // first message parameter
            ref COPYDATASTRUCT lParam // second message parameter
            );        [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string
            lpWindowName);
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                int WINDOW_HANDLER = FindWindow(null, @"ReceiveMessage");
                if (WINDOW_HANDLER == 0)
                {
                    return;
                }
                else
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)100;
                    cds.lpData = this.textBox1.Text;
                    cds.cbData = len + 1;
                    SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);            }        }
      

  5.   

    接受
    public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;        }
            const int WM_COPYDATA = 0x004A;
            public Form1()
            {
                InitializeComponent();
            }        protected override void DefWndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case WM_COPYDATA:
                        COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                        Type mytype = mystr.GetType();
                        mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                        this.textBox1.Text = mystr.lpData;
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
            }
      

  6.   


    我问的是如何传递一个结构,我通常使用的是用C#写接口,在里面定义函数,通过函数参数传递结构.但是那样很麻烦,我想用WM_COPYDATA 消息函数来实现,用这个消息传递单个的字符串我已经实现了,我就是不知道怎么用它来传递一个结构????
        typedef struct tagCOPYDATASTRUCT{
                DWORD dwData;//用户定义数据
                  DWORD cbData;//数据大小
                  PVOID lpData;//指向数据的指针
                 }COPYDATASTRUCT;
              该结构用来定义用户数据。
       我不知道在C#里,如何实现让lpData成为指向数据的指针的指针,还有就是接收的时候如何接收指向指针的指针???
      

  7.   

    http://www.cnblogs.com/feiyun0112/archive/2007/02/01/637280.html
      

  8.   

    感谢  feiyun0112 
    看了您的文章,我受益匪浅!
    再请教一下,如果是给其他程序,比如delphi开发的程序,或者VB开发的程序,它们给C#窗体发送WM_COPYDATA 消息,或者反过来,C#给它们发送WM_COPYDATA 消息,接收的时候应该注意些什么呢??????