У меня есть метод, например:
void Something::DoSomething(double d1, double d2, void* callback)
{
AsyncCallback^ acb = gcnew AsyncCallback(this, System::IntPtr(callback)); //error C3364: 'System::AsyncCallback' : invalid argument for delegate constructor; delegate target needs to be a pointer to a member function
sensor->BeginSearch(d1, d2, acb);
}
Как мне заставить это работать?
Этот метод оболочки может быть экспортирован и будет использоваться собственным приложением c ++.
РЕДАКТИРОВАТЬ:
После некоторых поисков мой текущий прогресс выглядит следующим образом:
.h
typedef std::tr1::function<void(void)>* callback_function;
ref class Something
{
public:
void DoSomething(double d1, double d2, callback_function callback);
void DoSomethingCallback (IAsyncResult^ ar);
private:
callback_function m_callback;
}
.cpp
void Something::DoSomething(double d1, double d2, callback_function callback)
{
m_callback = callback;
AsyncCallback^ acb = gcnew AsyncCallback(this, &Something::DoSomethingCallback);
sensor->BeginSearch(d1, d2, acb);
}
void Something::DoSomethingCallback(IAsyncResult^ ar)
{
(*m_callback());
}
Использование в собственном коде:
ч.
class NativeClass
{
public:
void NativeFunction(double d1, double d2);
std::tr1::function<void()> m_callback;
}
.cpp
void NativeClass::NativeFunction(double d1, double d2)
{
m_callback = std::tr1::bind(&SomethingElse::DoSomethingCallback, this);
sensor->DoSomething(d1, d2, &m_callback);
}
void SomethingElse::DoSomethingCallback(void)
{
// Does something
}
Теперь, похоже, работает.Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что мой управляемый код выдает следующее исключение где-то в (*m_callback())
, когда программа останавливается в классе с именем xxfunction
:
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.