将成员函数用于 C 样式回调时固定委托
Posted
技术标签:
【中文标题】将成员函数用于 C 样式回调时固定委托【英文标题】:Pin a delegate when using a member-function for a C-Style callback 【发布时间】:2013-05-16 23:41:55 【问题描述】:当为 C 风格回调使用成员函数时,是否需要固定委托以使其不被 GC 收集或移动?我已阅读有关该主题的几篇文章,但无法确定是否有必要或正确的实施方式。
public delegate void FeedCallbackDelegate(int type,void* data,void *param);
public ref class CStyleApiWrapper
public:
void StartFeed();
private:
FeedCallbackDelegate^ managedFeedCallback;
IntPtr unmanagedFeedCallbackPtr;
void FeedCallback(int code,int type,void* data,void *param);
;
void CStyleApiWrapper::StartFeed()
managedFeedCallback = gcnew managedFeedCallback(this, &CStyleApiWrapper::FeedCallback);
unmanagedFeedCallbackPtr = Marshal::GetFunctionPointerForDelegate(managedFeedCallback);
//Start Feed
StartFeed((NOTIFY_FUNC)(void*)unmanagedFeedCallbackPtr,0,NULL);
void CStyleApiWrapper::FeedCallback(int type,void* data,void *param)
//Process Feed
...
【问题讨论】:
【参考方案1】:仅调用 GetFunctionPointerForDelegate
不足以阻止 GC 回收您的委托。你必须 Alloc
一个带有 GCHandle.Alloc
的句柄。 Alloc
添加对委托的引用,以防止处置。然后你必须Free
处理完成后处理它。
这是一个很好的示例页面:http://msdn.microsoft.com/en-us/library/367eeye0%28v=VS.100%29.aspx。
【讨论】:
以上是关于将成员函数用于 C 样式回调时固定委托的主要内容,如果未能解决你的问题,请参考以下文章
没有可行的重载'='用于将std :: function回调赋值为成员函数
C++14 或 C++1z 是不是已经或将不再定义调用委托类成员函数指针?