让我首先说我不知道我目前不知道什么,所以我认为我也在寻找更好的问题,而不是具体的答案。我的 .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 土地,在那里我几乎可以毫不费力地弄清楚图书馆的作用以及如何使用它。
提前感谢您的任何见解。