C++ Cx 将委托传递给本机 C++

C++ Cx passing delegates to native c++

我需要找到一种方法来将回调从 C++/Cx 检索回本机 C++。在 C++ 代码中,它们存储为函数指针,而在 C++/Cx 中,它们存储在委托中。我发现在 C# 和 C++/CLI 中有一个类似于 GetFunctionPointerForDelegate() 的函数,但在 C++/CX 中似乎没有类似的函数。这个问题真的有解决办法吗?

我对 C++/CX 一无所知,但快速搜索后发现了这个问题,对我来说这听起来像是您要完成的任务:

codeproject.com: Convert a Delegate to a Function pointer to Implement Callback function

C++/Cx 是 C# 应用程序和 C++ 本机库之间的中间层。我设法将指针从 C# 传递到 WinRt(C++/Cx) 层,如下所示:

del d = new del(callBackFunction);                  //declare a delegate and               
                                                    //add a function to delegate
IntPtr p = GetFunctionPointerForDelegate(d);        //retrieve pointer

w.retrieveCallbackFunction(p.toInt32());    //pass a pointer as int to WinRt layer

在 WinRt 层内部 retrieveCallbackFunction:

void* x=(void*)p;            //cast it to void*
callbackFunctionType ptr = (callbackFunctionType)x;   // cast it to a type
                                                      // of function pointer
ptr(...);            //call function

我知道这不是最好的解决方案,但这个现在对我有用。

编辑

防止垃圾收集器收集函数或委托也是一个好主意

GCHandle callbackHandle = GCHandle.Alloc(d); // !!!!

但现在由我们稍后释放此内存。