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