Win32编程对现代专业人员有多大的相关性?

33
作为Charles Petzold的书籍《代码》和《注释图灵》的忠实拥趸,我偶然发现了他的另一本书《Windows编程》,这本书用C语言教授Win32编程。我是一名刚入门的计算机科学专业学生,最初学习的是C语言,但现在我使用C#和.NET进行Windows编程。因此,我想知道在专业的Windows程序中,Win32是否仍然有用?作为一个想要编写Windows应用程序的学生,是否值得深入学习这本书所涉及的Win32 API呢?

这个问题的副本:https://dev59.com/GnVD5IYBdhLWcg3wWaVh - MarkJ
15个回答

35

这真的取决于您想要开发的应用程序的种类。对于大多数目的而言,C#和.NET是完全适合的。但是,有某些需要尽可能少的依赖项的应用程序(例如shell扩展),这些应用程序不适合作为.NET应用程序来实现。对于这些应用程序,您需要使用Win32。

无论您是否在大部分工作中使用.NET,始终有必要至少基本了解Win32。


33

我完全同意Joel Spolsky在他众多精彩文章中所写的内容。我认为了解机器的底层不仅可以编写高质量的代码,而且可以解决必然出现的问题。

因此,是的,至少了解WIN32 API的基础知识非常重要,即使不深入了解,也至少要知道它存在于你将编写的所有代码的基础之上。


更高级别的API已经非常成熟了。只需知道它的存在可能就足够了。 - Dustin Getz

16

如果你正在Windows上编写C#代码,这是非常相关的。并不是所有Win32的功能都通过.Net库暴露出来。我在这里描述了WM_SETREDRAW消息技术的一个具体示例:WM_SETREDRAW。在其他时候,这也是控件焦点问题所需的。

此外,了解Win32和Windows的工作原理将使您更好地理解C#/.Net的各个方面,例如:

  • Control.Invoke()实际上是做什么的?
  • Control.BeginInvoke和Control.Invoke之间有什么区别?
  • 实际上是什么导致我的控件事件触发,例如OnClick等,我该如何调试它。

话虽如此,WPF改变了所有这些,如果您只编写.Net 3 / 3.5代码,则我的论点失去了部分相关性。


13

在我看来,不需要。我很久以前就学过了,所以你不必学。

我认为你先学习C是很好的选择,现在也可以偶尔编写C程序,但我不认为深入研究win32 API有什么用处。老实说,那个东西相当混乱。


3
在C#中即使是托管代码,有一些有用的底层函数仍然只能从wind32 api中调用。 - mmcdole
5
没错,这是一个很混乱的局面。正因如此,熟悉其中的套路对你会很有用。 - Treb
2
5年前,我百分之百的时间都花在Win32上。现在则是零。我觉得对于我的日常工作来说,了解它并没有太大帮助,相比起其他需要学习的东西来说。它对我来说更像是历史上的一段经历,就像我脑中记忆着Z80和6502的操作码一样有用。 - Nosredna
2
有经验的直接API编程和了解API文档将会在很大程度上帮助避免某些编程错误。例如,在不同线程中使用GDI对象会导致所有语言和开发环境中的问题。 - mghie
1
那是学习不使用不同线程的GDI对象的最有效方法吗?听起来像是学习种植小麦以便制作更好的面包。 - Nosredna
1
众所周知,具有更广泛背景的开发人员做出更好、更明智的决策。用户界面对象的线程亲和性已被命名为一个重要方面,但COM公寓规则或堆管理也是如此。本质上,这个问题类似于学习C语言是否是一个好主意的问题,答案是:是的,绝对是。即使你不打算使用它,它也会教给你很多任何编程语言都相关的东西。如果没有其他的,至少当你阅读.NET源代码时你能理解它。 - IInspectable

8

我认为学习基础知识非常重要。如果你只学会了显示带有一些字段、一些按钮和菜单的窗口,或者在一个单独的窗口中画一些东西,那么这将帮助你学习Windows真正的工作原理的基础知识。我相信理解消息循环以及几乎所有你看到的东西都是一个窗口的实现,这些都是每个人都应该知道的基本事情。当我第一次意识到按钮本身就是一个窗口时,我的眼睛真的被打开了。然后它帮助你理解,通过发送这些窗口消息可以打开和关闭事物的功能。子类化窗口可以让你访问.NET或VB Classic等工具中没有暴露给你的功能,并增强窗口的功能。


6

正如AlexDrenea所提到的,一定要学习基础知识。虽然.NET可以帮助你屏蔽很多Win32 API调用,但是Win32 API是如此庞大,你肯定会遇到.NET没有为你封装的情况。

一个真实的常见情况是在ListViewColumns上显示排序箭头


5

我不认为学习Win32 API对任何人来说都是现实的。这些API(是的,不止一个)非常庞大,你几乎永远不需要详细了解它们的全部内容。我建议您先了解一些基础知识(例如窗口创建、窗口消息、窗口过程,可能还有一些GDI等),然后在需要时使用MSDN查找其他信息。


我同意。即使是编写了完整win32应用程序的人也不知道全部。我想我曾经尝试过Petzold的所有东西。但我只记得我多次使用的部分。 - Nosredna

4
根据格雷格的评论,这在某种程度上取决于领域。我经常进行Windows CE / 移动编程,在许多设备上,.NET对资源的占用太高,而其他框架(如MFC)没有完全实现。在这种情况下,Win32的很多内容仍然非常相关。
话虽如此,我不会一开始就学习所有这些知识,我只会简单了解基础知识,并在需要时深入了解其余部分。文档和示例足以支持这种方法,同样可以从像这样的社区获得在线帮助。

3

除非你需要某些不在.NET Framework中的功能(比如获取打印机驱动程序的详细信息),否则不需要。这大约是你将要做的工作中的99%(当然,这只是我随意编造的一个任意值)。

即使你正在使用Win32而不是.NET,真的有必要学习书中的同样深度吗?浏览一下章节,了解一下如果将来遇到问题时应该去哪里查找。然后就可以停止了。有空闲时间或需要时再深入研究。


2

我认为这个问题已经有答案了,但是如果你进行.NET 2.0开发或任何.NET中的winforms开发,你肯定会遇到许多问题,因为某些部分的框架包装了win32和mfc,你需要深入研究才能使其按预期工作。


.NET(无论版本)不包装任何MFC代码。 - IInspectable

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