1

让我首先说我不知道​​我目前不知道什么,所以我认为我也在寻找更好的问题,而不是具体的答案。我的 .Net/C# 足够稳固,而我的 C/C++ 也不错。

最近,我发现标准 .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 土地,在那里我几乎可以毫不费力地弄清楚图书馆的作用以及如何使用它。

提前感谢您的任何见解。

4

2 回答 2

2

这方面的圣经是 Adam Nathans 的优秀著作“.Net 和 COM 完整的互操作性指南”

包括 PInvoke 和几个音频类型示例

于 2012-10-11T22:02:08.280 回答
1

1) windows API 文档包括每个方法/枚举/等的头文件、库和dll文件。当我通读到注意到这一点时,我只是没有向下滚动足够远。头文件不一定要与 dll 位于同一目录中;编译程序时,它的内容只是简单地复制/粘贴到 .c 文件中。我在这里缺少的部分是我在这里读到的编译的链接阶段

2) 文档在那里——我只需要更加努力地寻找它。

3)如何检测 dll 的类型?(COM、.NET、WIN32)

4)音频的api理论上可以跨越多个dll,所以最好的做法是找到api文档,找到你想要包装的方法,然后找出这些方法在什么dll中,然后导入每个dll .

于 2012-10-12T05:10:37.383 回答