Tag: callback

通过Interop / pinvoke传递C#回调函数

我正在编写一个C#应用程序,它使用Interop服务来访问本机C ++ DLL中的函数。 我已经使用了大约10种不同的function。 现在我不知道如何处理将回调作为参数传递,以便DLL可以调用我的代码。 这是DLL的函数原型: typedef void (WINAPI * lpfnFunc)(const char *arg1, const char *arg2) 并且允许我传递上述类型的函数: int WINAPI SetFunc(lpfnFunc f) 这是委托和函数定义的C#代码: public delegate void Func(string arg1, string arg2); public static void MyFunc(string arg1, string arg2) 这是我的SetFunc Interop函数的C#代码: [DllImport(“lib.dll”, CharSet = CharSet.Ansi)] public static extern int SetFunc(Func lpfn); 最后这里是我调用SetFunc函数并将其传递给我的回调的代码: SetFunc(new Func(MyFunc)); 不幸的是,我的function应该被调用。 SetFunc函数的返回值是返回Success的错误代码,所以要么它没有调用我的函数,要么因为我的代码错误而无法正常工作。

为什么C ++函数的C ++回调需要“extern C”?

我在Boost代码中找到了这样的例子。 namespace boost { namespace { extern “C” void *thread_proxy(void *f) { …. } } // anonymous void thread::thread_start(…) { … pthread_create(something,0,&thread_proxy,something_else); … } } // boost 为什么你真的需要这个extern “C” ? 很明显, thread_proxy函数是私有内部的,我不认为它会被破坏为“thread_proxy”,因为我实际上根本不需要它。 事实上,在我编写的所有代码中,我在许多平台上运行,我从未使用过extern “C” ,这与普通函数一样。 为什么添加了extern “C” ? 我的问题是extern “C”函数污染了全局命名空间,它们实际上并没有像作者所期望的那样被隐藏。 这不是重复的! 我不是在谈论破坏和外部联系。 在这段代码中很明显,外部链接是不需要的! 答: C和C ++函数的调用约定不一定相同,因此您需要使用C调用约定创建一个。 参见C ++标准的7.5(p4)。