我目前正在做一个小的 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_ptr,但我认为这不会起作用,因为 this 指针不能用于初始化任何 pin_ptr。
我希望我能明确我想要达到的目标,也许有人可以帮助我。问候, 赛瑟