我在C#中要调用C++写的非托管的dll,其中有一个函数是要使用的回调函数,且这个函数在执行中会递归多次调用到C#的回调函数,现在的问题是,这个dll中的函数在第一次调用回调函数时是没有问题,能正确显示结果,但是第二次再调用回调时就会出现错误,好像是ESP栈什么的被破坏之类的,有谁知道怎么解决这种问题,或者有什么更好的解决方案.

解决方案 »

  1.   

    通常是代码问题,检查一下dll的代码
      

  2.   

    你检查一下代码,是不是有使用的变量没有及时释放造成的。
    我以前写过,出错原因是我在建立TCP侦听的时候,没有释放以前以前建立的变量,会出错。
      

  3.   

    你检查一下代码,是不是有使用的变量没有及时释放造成的。
    我以前写过,出错原因是我在建立TCP侦听的时候,没有释放以前以前建立的变量,会出错。
      

  4.   

    你检查一下代码,是不是有使用的变量没有及时释放造成的。
    我以前写过,出错原因是我在建立TCP侦听的时候,没有释放以前以前建立的变量,会出错。
      

  5.   

    调用参数或者规则错了吧
            delegate bool EnumWindowsHandler(IntPtr hwnd, IntPtr lParam);        [DllImport("user32.dll")]
            static extern bool EnumWindows(EnumWindowsHandler EnumHandler, IntPtr lParam);        public Form1()
            {
                InitializeComponent();
            }        private bool EnumWindows(IntPtr hwnd, IntPtr lParam)
            {
                listBox1.Items.Add(hwnd);
                return true;
            }        private void button1_Click(object sender, EventArgs e)
            {
                EnumWindows(new EnumWindowsHandler(EnumWindows), IntPtr.Zero);
            }
    这个是枚举窗体的,你参考下本来stdcall调用方式参数传递是从右至左参数按顺序压栈的
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
    这个回调的话,就会先push lParam,再push hwnd,而调用EnumWindows方法返回之后就会ret *,等同于把EnumWindows中的局部变量以及hwnd、lParam两个参数弹栈。
    但如果假设你的EnumWindows少了一个lParam参数,那返回后就不会有lParam参数弹栈,但是调用方并不知道,同样会将lParam和hwnd当参数压栈,很明显,EnumWindows执行完第一次后,堆栈指针(ESP)已经不正确了,报错也是很正常。所以重要的问题是,调用时需要保证调用约定的正确和所有参数所占用的空间大小要匹配
      

  6.   

    其实我的代码很简单,就是去遍历一个压缩包里的文件,遍历的API是用C++写的,我需要在递归文件是把文件的信息发送给我C#,由C#展现出来,递归的时候只是简单的调用一下C#的函数,但是我不明白,为什么我第一次调的时候,一切都很正常,但是第二次调的时候就出错