【发布时间】:2012-10-11 21:51:31
【问题描述】:
首先让我说我不知道我目前不知道什么,所以我认为我也在寻找更好的问题,而不是具体的答案。我的 .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 领域,我几乎可以毫不费力地弄清楚库的作用以及如何使用它。
提前感谢您提供任何见解。
【问题讨论】: