学习win32 API是否值得?

38

我确定有人一定会特别询问这个问题,但是从我所看到的情况来看,似乎没有人这样做(有关学习win32的问题,但这并不包括是否值得这样做)。

我非常有兴趣深入了解我使用的所有系统(我主要使用C#编程,至少是在专业领域),因此我想知道 - 学习win32是否值得,或者是否过度?我在浪费时间吗?我可以获得的知识是否值得这样做?


在StackOverflow上有类似/相关的问题:

学习低级WinAPI编程仍然有意义吗?
Win32编程对现代专业人员还有多大的相关性?

19个回答

26

如果您计划未来从事Windows开发,那么了解Win32的工作原理将会非常有价值。它可以让您深入了解像Windows、消息和GDI等.NET级别无法展示的内容。

我不建议您尝试使用Win32编写所有应用程序,但我认为任何Windows开发人员都会受益于使用C/C++编写简单的Win32应用程序。

对于诸如WPF之类的技术来说,这种情况并不是那么明显,因为它们不太依赖于Win32,但是了解Win32的工作原理将有助于您理解或欣赏WPF中的某些设计决策。


当然,我只会在必要的时候使用它。 - ljs
1
@Andrew Grant:我完全同意 - 由于.NET库的很多部分都是基于Win32的,所以当我记得在许多情况下它们只是包装底层的Win32 API时,我经常能更快地理解它们的设计选择。 - Mike

22
如果以下条件都成立:
  1. 你将要进行任何Windows编程。
  2. 你想成为“万无一失”的技术专家。
  3. 你喜欢学习。
我建议学习低级窗口编程的相关概念。像.NET这样的抽象层可以创造并允许开发人员在不需要过多知识的情况下完成不可思议的事情。然而,当.NET被用于出乎其作者意料的方式时,可能会暴露其中的一些微妙的错误。这时候,一些win32 API知识就能起到很大的作用。
你是否需要编写消息泵?我怀疑。它可以帮助诊断问题吗?当然!

确实。了解你的下一级(或下两级)非常方便,因为抽象泄漏 - André Caron
1
在这里,大约六年后,Windows Runtime/通用 Windows 平台成为指定的 .NET 继承者。本机(即 C 和 C++)包装器围绕 Windows API。了解 Windows API 有帮助吗?比以往任何时候都更有帮助! - IInspectable
我喜欢你的回答... - Vinicius Gonçalves

16

这个问题很像“学习汇编语言是否值得”,答案也是一样的:

“是的,因为你将理解基础知识,并能够比那些只在抽象层面工作的人更深入地认识问题。”

然而,同样的道理,你大概不会直接编写Win32 API 99.5%的时间。


11

当他们发明C语言来取代汇编语言时,人们可能会问:“学习汇编语言是否值得?”学习两者的价值在于能够转而使用汇编语言来完成C语言无法实现的任务(例如触发中断)。

同样的道理也适用于Win32。有些事情在C#中是无法实现的。如果你不了解Win32 API,则会将某些事情视为不可能。然而,一旦你知道自己缺少什么,就能在这些罕见的情况下“转向Win32”并完成它们。

另一个看待问题的方式是:编程就是要同时能够以多个抽象级别进行思考。例如,如果你知道你的语言使用不可变字符串,你就不会编写一个将单个字符添加到其中一个字符串10,000次的算法,因为这样会很慢。如果你了解Win32 API,你就能够考虑你在C#中编写的每一行代码实际上是如何实现的,这将帮助你编写更好的代码。


而且,有了可用的参考源,了解Windows API对于理解某些实现的影响非常有帮助。如果你知道这些,你肯定会做出更好的决策。 - IInspectable

8

对我来说,学习一个我不使用的API(我假设“深入”是暗示的)是浪费时间。我宁愿花费有限的时间和脑力学习新概念或探索新工具,而不是熟悉现有的我现在不需要使用的工具。当我需要一个特定的工具而我又没有或者必须使用我不熟悉的工具时,那就是深入学习的时候。在此之前,我可能会进行足够的调查,以了解它是否对我有用,但不会更多。


7

是的,你应该学习Windows的基础知识(很多内容都在Win32之前)。为什么呢?就像我了解榫卯接口的工作原理一样,尽管我不会自己制作家具,或者了解内燃机的工作原理,尽管我不会自己维修汽车。

你在更高层次的抽象上工作,这很好,但当抽象泄漏时 - 这不是“如果”,而是“何时” - 如果你不了解Windows的基础知识,你会迷失方向。如果你不知道至少一些API,当你需要调用不可用于.Net的功能时,你将毫无头绪。

除此之外,难道不是出于好奇心的缘故吗?


6
是的,Win32 API的原则对于学习非常有用——这些原则是其他所有内容构建的基础。
GUI开发的.NET API,包括Windows.Forms和WPF,在Win32 API的限制内完成其工作。这些框架的关键架构决策受到Win32 API的限制和指导。
另一方面,深入了解API可能不会为你带来很多价值,因为需要学习的内容很多,并且由于大部分时间都在使用C#,你将较少直接使用这些知识的机会。
顺便说一下,其他技术也适用于这种情况——例如网络、加密和硬件设计。学习基本原理将帮助您成为更好的开发人员。

4
如果您正在尝试编写VB6应用程序,则Win32 API允许您执行许多VB6不支持的操作。
如果您正在编写C# WinForms应用程序,则建议首先学习.NET Framework的广泛应用。
编辑
如果您真的想了解Windows底层发生了什么,那么您可能需要查看Charles Petzold的《 Programming Windows 3.1》一书。

我已经拥有相当不错的WinForms工作知识(鉴于.NET框架的广泛性,这都是相对的),但当然这只是一个不完美的抽象,我对库的“引擎盖下”的实际了解并不充分。 - ljs
一个抽象层——没错,但也被称为更一致和可用的API。泄漏……希望不会! - Richard Ev

3
我个人认为学习Win32 API仍然是值得的。在我开始学习Win32之前,我已经学过一些VB(A)、Pascal等编程语言。通过学习Win32,我了解了Windows的许多知识,并且理解了Windows中的工作原理。一切都变得更加清晰易懂。因此,回答你的问题——通过学习Win32,你将会学到很多关于Windows的知识。正如你所说——你是一名C#程序员,我不确定你是否经常使用它,因为几乎所有你需要的东西都已经在.NET中了。

2
我不会一遍又一遍地重复别人已经说过很多次的话。
这是一个链接,指向我目前正在学习Win32基础知识的Win32教程。我觉得它非常有趣,而且易于理解。
这个教程帮助我理解了我在中学时期开始编程时没有理解的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接