передача обратного вызова указателя неуправляемой функции управляемому коду с использованием взаимодействия C ++

Я пытаюсь добавить некоторый управляемый код в существующее приложение c ++ GUI. Я бы хотел, чтобы работал функциональный обратный вызов ... в частности, я хотел бы передать указатель метода из НЕУПРАВЛЯЕМОГО кода в УПРАВЛЯЕМЫЙ код, и чтобы управляемый код вызывал обратный вызов.

Я смотрю на что-то вроде этого :

typedef int (__stdcall *ANSWERCB)(int);  //Delegate declaration

class UnmanagedObject
{
public:

 UnmanagedObject() {}
 int MethodD(int n) { return n; }
};

с соответствующим управляемым классом:

public delegate int CallbackDelegate(int i);

public class ManagedClass
{
    public ManagedClass() {}
    public void MethodD( CallbackDelegate cd ) { cd.Invoke( 5 ); }
}

Проблема в том, что я всю жизнь не могу понять, как на самом деле вызывать это из управляемого кода:

UnmanagedObject* obj = new UnmanagedObject();
ManagedLibrary::ManagedClass^ mc = gcnew ManagedLibrary::ManagedClass();
mc->MethodD( /* what do I pass here? */ );

Я пробовал:

ManagedLibrary::CallbackDelegate^ cd = gcnew CallbackDelegate(obj, &UnmanagedObject::MethodD);

, но он генерирует ошибку компилятора: «цель делегата должна быть указателем на функцию-член».

Любой гуру взаимодействия может помочь?

Спасибо!

1
задан Mark 1 September 2010 в 10:29
поделиться

1 ответ

Проблема начинается с объявления указателя функции ANSWERCB. На самом деле он не подходит для вызова функции MethodD(), это метод экземпляра класса. Сначала заставьте это работать на собственном С++, вам нужен указатель на функцию-член.

После этого у вас будет намного меньше проблем с работой из управляемого кода, Marshal::GetDelegateForFunctionPointer() даст вам то, что вам нужно.

2
ответ дан 2 September 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: