我正在尝试使用P / Invoke从C#调用Windows多媒体API(winmm.dll)。
原因是我试图移植一些非托管的C ++代码,这些代码以不同的频率生成音调,并且对托管库没有好运,因此我试图直接重用已经很好运行的C ++代码。
我首先进入pinvoke.net,查找各种功能签名,然后从此处粘贴提供的DllImport行。
但是,令我感到困惑的是,事物的映射方式显然是不一致的。
例如,waveOutPrepareHeader函数(MS Docs,pinvoke.net)。第二个参数是指向WAVEHDR结构的指针。 pinvoke.net页面对我来说很有意义,因为它应该是一个IntPtr,它指向包含该结构的内存块。我使用GlobalAlloc和GMEM_FIXED进行了准备,然后使用Marshal.StructureToPtr来填充数据。然后,我将从GlobalAlloc返回的指针作为IntPtr传递给该函数。
但是,对于waveOutOpen(MS Docs,pinvoke.net)和waveOutWrite(MS Docs,pinvoke.net)之类的其他函数,结构的指针作为对a的引用传递托管结构与非托管结构匹配。
为什么有区别?将引用传递给托管结构时,它如何工作? P / Invoke层是否只是检测到这一点并在内部进行映射?
我想知道,因为在某些情况下,在代码运行时遇到访问冲突,因此我试图用细齿梳来进行函数调用,这对我来说毫无意义。