Я пытаюсь добавить некоторый управляемый код в существующее приложение 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);
, но он генерирует ошибку компилятора: «цель делегата должна быть указателем на функцию-член».
Любой гуру взаимодействия может помочь?
Спасибо!
Проблема начинается с объявления указателя функции ANSWERCB. На самом деле он не подходит для вызова функции MethodD(), это метод экземпляра класса. Сначала заставьте это работать на собственном С++, вам нужен указатель на функцию-член.
После этого у вас будет намного меньше проблем с работой из управляемого кода, Marshal::GetDelegateForFunctionPointer() даст вам то, что вам нужно.