C++/在托管类中调用非托管函数时发生CLI System.AccessViolationException异常 我在C++中有一个本地回调函数,让我们这样说: void ::CallbackFunction(void) { // Do nothing }
现在我有了另一个本机函数:C++/在托管类中调用非托管函数时发生CLI System.AccessViolationException异常 我在C++中有一个本地回调函数,让我们这样说: void ::CallbackFunction(void) { // Do nothing },c++,c++-cli,C++,C++ Cli,现在我有了另一个本机函数: 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); } 好,现在我调用了托管函数,并赋予了这
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)();
}
//这行不通
//typedef std::tr1::function*回调函数;
typedef std::tr1::function*回调函数;
回调函数m_nativCallback;
void::SomeManagedFunction(回调函数)
{
m_nativCallback=回调;
//做一些触发ManagedCallback的事情
}
void::SomeManagedCallback(IAsyncResult ^ar)
{
(*m_nativCallback)();
}
现在,如果我调试这个,我会得到一个未处理的异常,类型为System.AccessViolationException,发生在.dll中。其他信息:试图在受保护的内存中读取或写入。这表示其他内存已损坏。错误消息
难道通话惯例有问题吗
谢谢本机部分设置错误:
void ::SomeNativeFunction(void)
{
m_callback = std::tr1::bind(&::CallbackFunction, m_Tcy); // save in m_callback | m_Tcy is the class where CallbackFunction exists
//this won't work
m_Tcy->SomeManagedFunction(m_callback);
}
这对我很有用:
void ::SomeNativeFunction(void)
{
m_callback = std::tr1::bind(&::CallbackFunction, m_Tcy); // save in m_callback | m_Tcy is the class where CallbackFunction exists
//this works, even tho the debugger dies on me when I try to debug this
m_Tcy->SomeManagedFunction(&m_callback);
}
回调功能正常,但在本机main中仍会出现错误:
First-chance exception at 0x00007ffb2b59dd60 in *.exe: 0xC0000005: Access violation at location 0x00007ffb2b59dd60.
Unhandled exception at 0x00007ffb2b59dd60 in *.exe: 0xC000041D: Exception during a user callback.
此外,我的visual studio 2010在调试回调(在我的C++/CLI包装中)时崩溃。如果我等待的时间足够长,它会抛出以下异常:
Access violation reading location 0xfffffffffffffff8.
如何在代码中使用
void::SomeManagedFunction(回调函数)
?您将什么作为回调传递
?@SlawomirOrlowski我将::CallbackFunction(void)
作为回调传递。当用户按下上下文菜单按钮时,我使用::SomeManagedFunction
。然后,SomeManagedFunction执行一个函数并需要设置回调,以便我知道调用的函数何时完成。如何在本机类中定义m_Tcy
?m_Tcy
是我的C++/CLI dll中本机类的共享指针<代码> MyTest< /COD>包含从我的本地C++访问的函数。如果我理解正确,一种类型的<代码> MyTest< <代码>是本地类,没有被管理,对吗?我认为m_tcy
是对托管类型的引用。它有点复杂m_tcy
当然是一个本机(C++/CLI)类,否则我将无法在本机应用程序中使用它。但是m_tcy
包含一个托管对象(随意包装)。因此,调用m_tcy
的SomeManagedFunction
意味着m_tcy
使用其托管对象来执行该函数。您可以呈现该本机类代码吗?否则很难估计这里的问题是什么。我猜想垃圾收集器会在运行时移动或删除您的托管内容。