我写了一个底层钩子,然后把截获的信息用WM_COPYDATA发给窗体,因为DLL是C++写的,窗体是C#的,所以用Marshal.PtrToStringAnsi时多接收几条后就会出现尝试读取受保护的内存,这通常指示其它内存已损坏?怎么办?
[StructLayout(LayoutKind.Sequential)]        
        public struct COPYDATASTRUCT
        {            public IntPtr dwData;            public int cbData;            public IntPtr lpData;        }
if (msg == 0x004A)
            {                
                WinAPIUtil.COPYDATASTRUCT cds = new WinAPIUtil.COPYDATASTRUCT();
                cds = (WinAPIUtil.COPYDATASTRUCT)Marshal.PtrToStructure(lParam, cds.GetType());                
                this.richTextBox1.AppendText("HWND :" + cds.dwData + "  type :" + Marshal.PtrToStringAnsi(cds.lpData).Substring(0, cds.cbData) + "\r\n");
            }

解决方案 »

  1.   

    Marshal.PtrToStructure 这个以后,是不是也应该释放一下 lParam指向的地址空间呢?
    没试过,建议而已.
      

  2.   

    没懂你的意思,lParam指向的是COPYDATASTRUCT 的指针啊,是底层钩子发过来的
      

  3.   

    不好意思,好久没来看这个,也不知道你的问题解决了没有。我的意思是这样的,因为不是详细了解PtrToStructure这个方法微软是如何实现的,所以,会不会是FrameWork先锁定了这个内存地址,然后再复制呢?如果是的话,释放的工作,理论上应该也会在这个方法中释放,但会不会在密集操作时,会有未释放然后访问的现象呢?所以,建议手工再释放一下,看看有没有改善而已。