【问题标题】:C++ Cx passing delegates to native c++C++ Cx 将委托传递给本机 c++
【发布时间】:2015-08-26 13:14:08
【问题描述】:

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

【问题讨论】:

  • 能给出答案的人可能对C++/Cx一无所知。由于您的问题是现在写的,只有 C++/Cx 和 C++ 专家才能回答。如果您可以详细解释为什么要这样做以及委托是什么,也许 C++ 专家可以提供解决方案或解决方法。我知道一些 C++,但我不知道你在问什么。我不是说你的问题不好,但我不明白,因为我对代表一无所知。

标签: c++ windows-runtime c++-cx


【解决方案1】:

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

在retrieveCallbackFunction内部的WinRt层内:

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); // !!!!

但现在我们要在以后释放这些内存了。

【讨论】:

  • 我相信你的第二行应该是:IntPtr p = GetFunctionPointerForDelegate(d);
  • GCHandle 用于.net,不适用于C++/CX 运行时。所以你的 EDIT 可能不对。
【解决方案2】:

我对 C++/CX 一无所知,但通过快速搜索找到了这一点,这对我来说听起来像是您想要完成的:

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

【讨论】:

  • 是的,但是这个解决方案是关于将委托到函数指针从 C++/CLI 转换为 C++,所以很遗憾它对我没有帮助。
  • 所以您正在寻找其他方式? C++ 到 C++/CLI?
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 2023-03-25
  • 1970-01-01
  • 2011-02-27
  • 2016-10-31
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多