【发布时间】:2018-10-22 12:55:02
【问题描述】:
我在 C++ 中有一个本机回调函数,让我们这样说:
void ::CallbackFunction(void)
{
// Do nothing
}
现在我有了另一个原生函数:
void ::SomeNativeFunction(void)
{
m_callback = std::tr1::bind(&::CallbackFunction, m_Tcy); // save in m_callback | m_Tcy is the class where CallbackFunction exists
m_Tcy->SomeManagedFunction(m_callback);
}
好的,所以现在我调用了一个托管函数,并给这个函数一个本地 c++ 函数。 让我们看看托管代码:
// This won't work
// typedef std::tr1::function<void __stdcall ()>* callback_function;
typedef std::tr1::function<void()>* callback_function;
callback_function m_nativCallback;
void ::SomeManagedFunction(callback_function callback)
{
m_nativCallback = callback;
// Does some stuff that triggers SomeManagedCallback
}
void ::SomeManagedCallback(IAsyncResult^ ar)
{
(*m_nativCallback)();
}
现在,如果我对此进行调试,我会收到 An unhandled exception of type System.AccessViolationException occurred in .dll Additional information: An attempt was made to read or write in the protected memory. This is an indication that other memory is corrupted. 错误消息。
可能是调用约定有问题吗?
谢谢
【问题讨论】:
-
如何在代码中使用
void ::SomeManagedFunction(callback_function callback)?你传递的callback是什么? -
@SlawomirOrlowski 我将
::CallbackFunction(void)作为回调传递。当用户按下上下文菜单按钮时,我使用::SomeManagedFunction。 SomeManagedFunction 然后执行一个函数并需要设置一个回调,以便我知道调用的函数何时完成。