学习win32 API值得吗?

时间:2009-02-22 23:13:14

标签: winapi

我确信有人会特意提出这个问题,但是从我看不到的人那里(有关于learning win32的问题,但这并不包括是否值得这样做。)< / p>

我非常有兴趣深入了解我使用的所有系统(我主要用C#编程,至少是专业的),所以我很想知道,非常简单 - 学习win32值得,还是有点过分?我在浪费时间吗?我获得的知识值得付出努力吗?


关于StackOverflow的类似/相关问题:

Does it still make sense to learn low level WinAPI programming?
How relevant is Win32 programming to modern professionals?

19 个答案:

答案 0 :(得分:24)

如果您计划将来进行Windows开发,那么了解Win32如何在最低级别工作肯定是非常宝贵的。它为您提供了对Windows,消息传递和GDI等内容的深入了解,这些内容在您达到.NET级别时会被隐藏。

我不建议您尝试使用Win32编写所有应用程序,但我觉得任何Windows开发人员都可以从使用C / C ++编写简单的Win32应用程序中受益。

对于像WPF这样对Win32的依赖性较小的事情,情况就不那么真实,但只知道Win32如何工作将有助于您理解或欣赏WPF中的一些设计决策。

答案 1 :(得分:20)

如果满足以下所有条件,我主张学习低级别Windows编程背后的概念

  1. 您将进行任何Windows编程。
  2. 当无法解释的时候,你想成为“去”的人。
  3. 你喜欢学习。
  4. 像.NET这样的抽象层可以创建并允许开发人员在不必了解太多内容的情况下完成令人难以置信的事情。然而,当.NET以其作者未曾预料到的方式使用时,它揭示了其中一个微妙的错误,那么这就是一些win32 API知识有很长的路要走的时间。

    您是否需要编写消息泵?我对此表示怀疑。它可以帮助诊断问题吗?你打赌!

答案 2 :(得分:15)

问题很像,“学习汇编值得”;答案是一样的:

“是的,因为你会理解基础知识,并且能够比那些只在顶层抽象工作的人更深刻地感知”。

但是,出于同样的原因,您可能将不会直接在99.5%的时间内直接编写Win32 API。

答案 3 :(得分:9)

当他们发明C代替汇编语言时,人们可能会问:“学习汇编语言是否值得?”知道两者的价值在于能够降低到装配以完成在C中无法完成的事情(例如触发中断)。

Win32也是如此。在C#中有些事情是不可能做到的。如果你不知道win32 api,那么你会认为某些事情是不可能的。但是,一旦你知道自己缺少什么,在极少数情况下,你就可以“掉到win32”并做到这一点。

另一种看待它的方式是:编程就是能够同时在多个抽象层次中思考。例如,如果您知道您的语言使用不可变字符串,则不会编写将单个字符添加到10000次的算法,因为它会很慢。如果你知道win32 api,你将能够思考你在C#中编写的每一行是如何实际实现的,这将有助于你编写更好的代码。

答案 4 :(得分:8)

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

答案 5 :(得分:6)

是的,Win32 API的原理对于学习很有用 - 这些原则是构建其他所有内容的基础。

用于GUI开发的.NET API,包括Windows.Forms和WPF,都可以在Win32 API之上的限制范围内完成它们的工作。这些框架的关键架构决策受到Win32 API的限制和通知。

另一方面,你不太可能从深入API中获得很多价值,因为有很多东西需要学习,并且考虑到你大部分时间都在C#工作,你将拥有减少直接使用知识的机会。

BTW,同样适用于其他技术 - 如网络,加密和硬件设计。学习基础知识将有助于您成为更好的开发人员。

答案 6 :(得分:6)

是的,你应该学习Windows(很多这些东西早于Win32)运行的基础知识。为什么?出于同样的原因,我理解榫眼和榫头如何操作,即使我不自己制作家具,或者为什么我理解内燃机如何工作,即使我不做自己的汽车维修。

你在更高的抽象层次上工作,这很好,但是当 abstraction leaks - 那不是“if”时,那就是“什么时候” - 如果你不了解Windows的基础知识,那么你会迷路的。如果您至少不知道某些API,那么如果您需要在.Net中不可用的P / Invoke功能,您将无法知道在哪里查看。

除此之外,是不是好奇足够的理由?

答案 7 :(得分:3)

如果您正在尝试编写VB6应用程序,那么Win32 API允许您执行VB6本身不支持的许多操作。

如果您正在编写C#WinForms应用程序,那么我建议您先学习.NET Framework的大部分内容。

修改

如果真的想要了解Windows中的内容,那么您可能需要查看Charles Petzold的Programming Windows 3.1副本。

答案 8 :(得分:2)

我个人认为学习Win32 API仍然值得。

据我记得当我开始学习Win32时(在做了一些VB(A),Pascal等之后),我学到了很多关于Windows的知识,并了解了Windows中的工作原理。一切都如此清晰。 :)

因此,根据您的问题 - 您将通过学习Win32来学习很多关于Windows的知识。 正如你所说 - 你是一名C#程序员而且我不确定你是否会经常使用它,因为几乎所有你需要的东西都已经存在于.NET中。

答案 9 :(得分:2)

我不会一遍又一遍地重复其他人所说过的话。

这是一个指向 Win32 tutorial 的链接,我目前正在学习Win32的基础知识。我发现它非常有趣且易于理解。

这本教程帮助我在第一次学习中学时,首先得到了我不理解的内容。

答案 10 :(得分:1)

如果我今天开始,我不会学习整个API。但是,我确实认为基本概念很重要,理解消息循环如何作为首要任务。

答案 11 :(得分:1)

这里的许多“否”答案似乎都集中在学习实际的方法,结构以及API中没有的内容。我会说是,但不是关注API的各个组件,而是关注整体设计及其运行方式。当您了解操作系统核心级别发生的情况时,甚至可以更轻松地对.NET代码进行故障排除。

答案 12 :(得分:1)

这个问题看起来有点陈旧,但无论如何我都会回答。

答案:复杂:是的。简单:可能没必要。

这实际上取决于你需要做什么。如果您需要使用.NET当前不支持的功能,请使用默认设置。但要小心,大多数溺爱框架提供的Win32都没有,如果你做了一些令人难以置信的愚蠢的事情,你的机器将会蓝屏。

我知道当.NET第一次出现时,我没有兴趣学习Win32,.NET就在这里,这是一个很好的改进。但关于Windows的可悲事实是:Windows中的所有新功能都是在本机代码中首先实现的。如果你想在.NET包装之前使用Windows的任何部分,你要么使用C ++的Win32,要么使用C#的Win32或VB.NET。对于Win32中的所有内容,.NET是一个包装器。因此,如果您不能等待,是的,如果您愿意,可以将Interop插入操作系统的较低内容。

了解Win32并且可能有一天Win64(无论它们碰巧称之为它)将始终是一项有用的技能。任何whizzbang技术都需要某些基础。

答案 13 :(得分:1)

.NET是使用win32 api实现的,任何希望对.NET有更深入了解的人都可以从win32api的至少边缘知识中获益。

答案 14 :(得分:1)

你永远无法“学习”整个win32 API,它太过分了,它将成为一个移动的目标。如果你用C#开发,那就没有实际意义了。

也就是说,尝试使用普通C和API调用创建记事本。这将教你足够让C#开发人员至少欣赏它。

答案 15 :(得分:0)

在您的职业生涯中,您不太可能只创建绿地应用程序,您可以自由选择所使用的技术和编程语言。

迟早你必须与用Win32和C / C ++编写的旧代码集成。在这种情况下,Win32的知识将有所帮助,特别是如果您使用PInvoke或C ++ / CLI进行集成。

答案 16 :(得分:0)

滥用.NET框架和Win32,你的机器会蓝屏吗?不知怎的,我对此表示怀疑。

了解Win32(或汇编语言)的最大价值在于,当某些内容无法按预期工作时,您必须对其进行调试。您对底层系统了解得越多,就越容易调试问题。

答案 17 :(得分:0)

我想进一步补充这一点。我从未正式研究过Win32 API / MFC。当我第一次对GUI编程感兴​​趣时,我开始使用Visual C ++ 4。无论如何,我希望我保留那个基础,因为我从来没有足够快地抓住(实际上我还很年轻),所以我学习了Visual Basic。

出于某种原因,德尔福从来没有对我感兴趣,即使我对帕斯卡很了解,但我离题了。这些天,我在IT部门工作并在NSIS中开发安装程序脚本 - 我经常需要NSIS不提供的其他功能,所以我制作了自己的插件并保持快速和依赖性免费,我选择Win32 API反对到MFC甚至是完全成熟的C ++。

这个评论的主要原因是我自己的好奇心让我迷上了。我想知道更多,那么学习API的最佳资源在哪里。一本书?网站?

MFC还值得一提吗?我确实看到一个网站关于一个开发Win32 GUI应用程序的人,在汇编!老实说,我认为这是过度的,但它是紧凑的,快速的代码,有趣的概念,但我从来没有能够掌握80x86组装(地狱,甚至大学里的RISC组装,我从来没能做过!)< / p>

答案 18 :(得分:0)

我认为,如果你的工作依赖于,知道系统如何工作总是很有趣。我并不是说你应该学习它的每一点,但仍然能够很好地理解,至少能够在你需要的那天自己搜索更多。

软件并不神奇 - 嗯......好吧......对于99%的案例: - )

这是一篇关于&#34;魔法思维的优秀文章的链接&#34;和&#34; GUID哥布林&#34;来自Eric Lippert关于该主题的内容:It's not Magic