首先我要说的是,我不知道我现在还不知道的是什么,所以我想,我也在寻找更好的问题,而不是具体的答案。我的.Net / C#足够坚固,我的C / C ++就是meh。
最近,我发现标准.Net框架中没有库来完成某些任务,虽然下载第三方库很容易,但我想了解如何自己动手尚不存在。
在最近的一个案例中,我需要在相对较低级别的Windows中处理MIDI,我不小心发现“winmm.dll”是我需要通过下载.net包装器来使用的库。 MIDI和浏览源。我知道我必须创建一个包装器类并完成整个P / Invoke事件才能实现。
我接下来要做的就是搜索Windows API上的文档来弄清楚“winmm.dll”的神秘框中发生了什么,令我高兴的是,有一个完整的Windows SDK,我能够下载和阅读。我浏览了“Windows开发”的“入门”部分,其中介绍了一些基于C ++的基础知识。它谈了一些关于COM,Windows头文件,并且我知道足够的C ++来获得要点。
现在,我需要帮助在几个问题上联系点:
1)到目前为止,Windows SDK似乎建议我要编程到特定的头文件而不是dll本身,但我发现的.net包装器通常指向一个特定的.dll而不是一个头文件...
/// <summary>
/// Returns the number of MIDI input devices on this system.
/// </summary>
/// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711608(VS.85).aspx
[DllImport("winmm.dll", SetLastError = true)]
public static extern UInt32 midiInGetNumDevs();
我的印象是头文件和DLL需要在同一个文件夹中,但是windows SDK包含一个包含所有Windows头文件的文件夹,并且没有DLL(我猜这个注册表在这里发挥作用)映射到特定的库?)?这些头文件最终如何映射到实际库,为什么我甚至不需要处理头文件来创建.Net包装器?
2)我似乎无法找到关于winmm.dll的文档,但我在Windows SDK的“Windows API”列表中找到了我可能需要的函数的引用,我很确定这些函数的代码在winmm.dll中。如何找到开始创建包装器所需的特定库的文档?如果我不知道我需要winmm.dll来访问Windows MIDI功能,我怎么能想到这一点呢?
3)有些DLL是COM,有些是普通的windows DLL,有些是.net DLL ...我怎么能告诉不同的前进?似乎为前两者创建包装器需要采用不同的方法。
4)MSDN上没有列出所有API的“Winmm.dll”页面,我认为这有一个很好的实际原因,但我不确定它是什么?我已经习惯了.Net在那里我可以弄清楚库的功能以及如何使用它几乎不费吹灰之力。
提前感谢任何见解。
答案 0 :(得分:2)
关于这一点的圣经是Adam Nathans的优秀书籍.Net和COM完整的互操作性指南'
包括PInvoke和几个音频类型示例
答案 1 :(得分:1)
1)windows API文档包含每个方法/枚举/等的头文件,库和dll文件。当我通读时注意到这一点,我只是没有向下滚动。头文件不一定必须与dll在同一目录中;编译程序时,只需将其内容复制/粘贴到.c文件中。我在这里缺少的部分是编辑的链接阶段,我读到了here
2)文档就在那里 - 我只需要更加努力地寻找它。
3)How can I detect the type of a dll? (COM, .NET, WIN32)
4)音频api理论上可以跨越多个dll,所以最好的做法是找到API文档,找到你想要包装的方法,然后找出那些方法所包含的dll,然后导入每个那些DLL。