使用托管类方法作为回调
Using Managed Class Method as Callback
我目前正在做一个小的 Midi 项目,现在我正在用 C++/CLI 编写一个小的"SharpMidi"库,以便我更容易使用托管代码中的本机 Midi 函数。
我现在被困在midiInOpen功能上:http://msdn.microsoft.com/en-us/library/windows/desktop/dd798458%28v=vs.85%29.aspx
从文档中可以看到,此函数需要一个非托管函数作为回调和可选实例数据。
我设法使用 System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate
但是我现在在将 this
指针从我的托管类转换为非托管指针时遇到问题,我什至不知道它是否可能是我希望它工作的方式。
HMIDIIN _midiInDevice;
void MidiInProcNative(HMIDIIN midiInDevice, UINT msg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
delegate void MidiInProc(HMIDIIN midiInDevice, UINT msg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
MidiInProc^ _midiInProc;
...
_midiInProc = gcnew MidiInDevice::MidiInProc(this, &MidiInDevice::MidiInProcNative);
cli::pin_ptr<HMIDIIN> midiInDevPtr = &_midiInDevice;
pin_ptr<???> thisPtr = this; // This is the line I'm struggling with
MMRESULT result = midiInOpen(midiInDevPtr, devId, (DWORD_PTR)System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(_midiInProc).ToPointer(), thisPtr, CALLBACK_FUNCTION);
如您所见,我已经尝试了pin_ptrs但我认为这不起作用,因为 this 指针不能用于初始化任何pin_ptr。
我希望我能说清楚我想尝试实现的目标,也许有人可以帮助我。问候Xaser
我现在在将此指针从托管类转换为非托管指针时遇到问题
只是不要,没有必要。 miniInOpen() 的 dwCallbackInstance 参数是原生C++的方便参数。 你在静态回调函数中得到它,让我们调用一个C++类的实例方法。
但是委托比成员函数指针强大得多,它们已经封装了这一点。 委托构造函数采用两个参数:目标对象和目标方法。 以便它可以自动调用实例方法。 你已经利用了这一点,你确实把它作为第一个论点。 因此,您可以确定 MidiInProcNative() 实例方法使用正确的对象引用。
只需为参数传递 nullptr。
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- 重写另一个方法 [C++] 使用的超类回调函数
- 将类方法设置为 OpenSSL 回调
- 具有指向方法回调的指针的通用回调模板类
- 带有类方法的 Cython 回调
- 一个类的方法作为回调
- 如何从回调方法访问自定义类成员
- 接受任意数量的回调并存储结果的 C++ 类方法
- 如何在本机回调中使用Cython CDEF类成员方法
- 将方法作为回调从一个类传递到另一个类
- 使用托管类方法作为回调
- 未知类方法回调,它接受 0 个参数并返回可转换为 int 的类型
- 在类中包装freeglut回调的最优雅方法
- 如何将方法作为回调传递给另一个类
- 在C++中使用派生类的静态方法作为函数回调
- 从本机C++类的实例回调到C++/CX ref类的最佳方法是什么
- 使用C回调的c++模板类方法
- 一个c++ signals2槽回调可以包含Objective-C/ c++类/选择器(方法)信息吗?
- 在构造函数中绑定到类中的回调方法
- 从C回调调用c++方法