如何将PaintDelegate ^转换为一个long作为refCon参数发送,以便一旦进入TrackTransferCB,我可以将其转换回来并调用它?只要我可以将其转换回代表,它转换为的长度不一定意味着什么。
这是一般的想法:
PaintDelegate^ paintDel = ...;
refCon = (long)paintDel; // This conversion doesn't work
...
static OSErr TrackTransferCB(Track t, long refCon) {
(PaintDelegate^)refCon->Invoke(); // This conversion doesn't work
}
哪种转换会以这种方式运作?
答案 0 :(得分:0)
委托对象是垃圾收集对象,就像.NET中的任何其他非值类型一样。这意味着垃圾收集器可以移动它们。这意味着获取其地址不起作用,当GC压缩堆时,地址将会改变。
我猜你需要这样做才能将非托管代码传递给委托。手柄是典型的解决方案。只需在每次创建新对象时增加一个计数器。将其存储在Dictionary<int, PaintDelegate^>^
中,并将计数器值传递给非托管代码。
Marshal :: GetFunctionPointerForDelegate()是另一种方法,非托管代码现在可以直接调用委托目标。不长但是空虚*。但是,你仍然需要将委托对象存储在安全的地方,这样就不会收集垃圾。我推荐前者。