日期:2014-05-17  浏览次数:21266 次

C# 回调 C++函数
本帖最后由 huzhiqiang123456 于 2013-12-09 12:55:11 编辑
最近遇到一个非常棘手的问题,都到最后一步了,还出错,请高手指点

我想用C++写底层,C#写界面。采用C#调用C++函数,有些网络事件需要回调处理,所以用了C++的函数指针和C#的委托。我的程序能够调用完成,但是就是最后的时候崩掉了,我查看堆栈程序停在C++函数的末尾,应该是函数调用结束出栈报错。提示Run-Time Check Failure #0。网上看了很多资料,说的是C++导出和C#调入约定不一致,问题是我设置的肯定是一至的啊。下面是程序的相关代码,往高人指点,感激不尽!


C++代码   

#ifndef STRUCTMOD_EXPORT
#define STRUCTMOD_EXPORT extern "C" __declspec(dllexport)
#endif

typedef void (*PFunTest)(INT32 iN);

STRUCTMOD_EXPORT void __stdcall CallerDll(PFunTest pfnTest);

void __stdcall CallerDll(PFunTest pfnTest)
{
if (pfnTest)
{
(*pfnTest)(10);
}
//就在这里,函数出栈时出错了!
}  


C#代码
   public delegate void TestD(Int32 iN);
        public static TestD t;
        [DllImport("CDll", EntryPoint = "CallerDll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        private static extern void CallerDll(TestD t);
        private void button1_Click(object sender, EventArgs e)
        {
            t = new TestD(Test);
            CallerDll(t);
        }

        public void Test(Int32 iN)
        {
            MessageBox.Show(iN.ToString());//显示没有问题 弹出对话框 显示 10
        }

------解决方案--------------------
是不是函数指针的声明也要用__stdcall

例如
typedef void (__stdcall LOG)(const char* sErr);

以上代码来自,lz可以参考:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/660123f8-83e2-43b5-a2de-db96fbdc2f98/pinvoke-c-callback-from-c
------解决方案--------------------
Run-Time Check Failure #0 ?这个错误信息是不完全的吧?

记得在委托上指明调用约定:

        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.Cdecl)]
        public delegate void TestD(Int32