Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/在托管类中调用非托管函数时发生CLI System.AccessViolationException异常 我在C++中有一个本地回调函数,让我们这样说: void ::CallbackFunction(void) { // Do nothing }_C++_C++ Cli - Fatal编程技术网

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
使用其托管对象来执行该函数。您可以呈现该本机类代码吗?否则很难估计这里的问题是什么。我猜想垃圾收集器会在运行时移动或删除您的托管内容。