C ++ / CLI System.AccessViolationException при вызове неуправляемой функции в управляемом классе - PullRequest
0 голосов
/ 22 октября 2018

У меня есть встроенная функция обратного вызова в 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..

Может ли быть, что что-то не так с соглашением о вызовах?

Спасибо

1 Ответ

0 голосов
/ 23 октября 2018

Родная часть была настроена неправильно:

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);
    }

Функция обратного вызова работает, но все еще получает ошибку в собственной основной, хотя:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...