学习低级别的WinAPI编程是否有意义?

是否有意义,拥有所有C#管理的幸福,回到Petzold的编程窗口并尝试生成带有纯WinAPI的代码?

什么可以从中学习?这不是太过时了吗?

0
修正了,谢谢MarkJ。
额外 作者 Camilo Díaz Repka,
Web应用程序将取代Windows应用程序。 Web应用程序通过浏览器工作。浏览器是一个Windows应用程序。
额外 作者 Sesh,
顺便说它是Petzold而不是Petzhold。
额外 作者 MarkJ,
消息泵是编程世界的核心。
额外 作者 GalacticJello,

15 答案

我见过低级别的Windows API代码......它并不漂亮......我希望我能忘掉它。我认为学习C语言中的低级别是有好处的,因为您可以更好地理解硬件架构以及所有这些东西的工作原理。学习旧的Windows API ......我认为这些东西可以交给微软的人,他们可能需要学习它来构建更高级别的语言和API ......他们构建它,让它们受苦;-)

然而,如果你碰巧发现一种情况,即你觉得自己无法用更高级的语言去做什么(很少或很远),那么也许会开始危险的潜水进入这个世界。

0
额外

了解Windows API可用的内容很重要。我不认为你需要用它来开发代码,但你应该知道它是如何工作的。 .NET Framework包含许多功能,但它不提供整个Windows API的托管代码等效项。有时你需要更加接近金属,并且知道那里有什么以及它的行为将会让你更好地理解如何使用它。

0
额外

简单的回答,是的。

0
额外

绝对。当没有人知道低级别时,谁会更新和编写高级语言?另外,当你理解低级别的东西时,你可以用更高级的语言编写更高效的代码,并且更高效地进行调试。

0
额外

Learning a new programming language or technology is for one of three reasons:
1. Need: you're starting a project for building a web application and you don't know anything about ASP.NET
2. Enthusiasm: you're very excited about ASP.NET MVC. why not try that?
3. Free time: but who has that anyway.

学习新东西的最佳理由是需要。如果你需要做一些.NET框架无法做到的事情(例如性能),那么WinAPI就是你的解决方案。在此之前,我们一直忙于学习.NET

0
额外

对于桌面上的大多数需求,你不需要知道Win32,但是有很多Win32不在.NET中,但是它在最终的应用程序中可能不到1%。

USB支持,HID支持,Windows Media Foundation就在我的头顶。有很多很酷的Vista API只能从Win32获得。

通过学习如何与Win32 API互操作,如果你使用桌面编程,你将会为你自己一个大忙,因为当你确实需要调用Win32时,你将会花上数周的时间。

0
额外

我会这样说。我不喜欢编程到Win32 API。与托管代码相比,这可能是一种痛苦。但是,我很高兴我知道它,因为我可以写程序,否则我将无法。我可以编写其他人不能的程序。此外,它还让您更深入地了解您的托管代码在幕后做了些什么。

0
额外

学习Win32 API所获得的价值(除了从学习关于机器的螺母和螺栓如何组合在一起而获得的一般洞察力之外)取决于您想要实现的目标。很多Win32 API已经很好地包装在.NET库类中,但不是全部。例如,如果你想要做一些严肃的音频编程,那么Win32 API的这一部分将是一个很好的研究对象,因为只有.NET类中最基本的操作才是可用的。最后,我检查了即使托管的DirectX DirectSound库也很糟糕。


冒无耻的自我推销的风险....

我刚刚遇到了Win32 API是我唯一的选择。我想对列表框中的每个项目提供不同的工具提示。我写了我是如何做到这一点这个问题

0
额外

比喻:如果你为生活建立汽车(编程),那么它非常适合知道引擎是如何工作的(Win32)。

0
额外

如果我学习像C这样的低级语言(甚至是汇编语言),这与问题是完全一样的。

它的编码速度肯定比较慢(虽然结果要快得多),但它的真正优势是你能够深入了解系统层面发生的事情,而不仅仅是了解别人对正在发生的事情的隐喻。

如果事情不能很好地运行,或者速度不够快,或者需要某种粒度,它也会更好。 (至少做一些子类和超类。)

0
额外

这个问题与宗教接壤:)但是我会反正我的想法。

我确实看到了在学习Win32 API方面的价值。大多数(即使不是全部)GUI库(托管或非托管)都会导致调用Win32 API。即使是最彻底的库也不能涵盖API的全部百分比,因此总是存在需要通过直接API调用或P /调用来插入的空白。 API调用的一些包装名称与底层API调用具有相似的名称,但这些名称并非完全自我记录。因此,理解底层API以及其中使用的术语,将有助于理解封装API以及它们实际执行的操作。

此外,如果您了解框架使用的底层API的性质,那么您将针对特定场景中应使用哪些库功能做出更好的选择。

干杯!

0
额外

就我个人而言,我不太喜欢Win32 API,但是学习它是有价值的,因为API将使用GUI实现更多的控制和效率,而不像Visual Basic这样的语言,并且我相信如果您要创作一个生活写作软件即使你不直接使用它,你也应该知道API。这是出于类似于学习C的好理由,比如strcpy比复制整数需要更多时间,或者为什么应该使用指向数组的指针而不是数值。

0
额外

在学习Win32 API之前,我一直坚持使用标准的C / C ++,并且相当直率,“学习Win32 API”部分并不是我一生中最好的技术体验。

一方面Win32 API非常酷。它就像是C标准API的扩展(当你有 CreateFile 时需要 fopen 。但是我猜UNIX / Linux / WhateverOS有相同的Gizmo函数。 Unix / Linux,他们有“一切都是文件”,在Windows中,他们有“一切都是......窗口”(不要开玩笑!见 CreateWindow !)。

另一方面,这是一个传统的API。你将会处理原始的C和原始的C疯狂。

  • 就像告诉一个人的结构有自己的大小来通过指向某个Win32函数的 void * 指针。
  • 消息传递也可能相当混乱:将C ++对象与Win32窗口混合会导致非常有趣的鸡或者egg 问题(当你写一种删除这个; 在一个类方法中)的有趣的时刻)。
  • 当你更熟悉对象继承时,必须对WinProc进行子类化,这是头脑分裂和低于最优化的结果。
  • 当然,还有这样的喜悦:“为什么在这个压裂的世界中,他们这样做了这件事?”当你用头敲击键盘太多而回到家时,只是因为有人认为编写一个API来改变“窗口”的颜色,而不是改变它的一个属性,而是通过询问它的父窗口来更合乎逻辑。 LI>

最后一方面(三只手?),考虑一些使用遗留API的人自己使用遗留代码样式。当你听到“ const 是虚拟人物”或“我不使用命名空间,因为它们会降低运行速度”,或者偶数更好的“嗨,谁需要C ++?我用我自己的品牌面向对象的C编写代码!!!”(不要开玩笑......在专业环境中,结果相当显眼.. 。),你会感到这种恐惧只会在断头台

所以...总而言之,这是一个有趣的体验。

编辑

重新阅读这篇文章后,我发现它可能被视为过度消极。不是这样。

有时很有趣(也令人沮丧)知道这些东西是如何工作的。你会明白,尽管有很多(不可能的)约束条件,Win32 API团队做了很好的工作,以确保从“旧Win16程序”到“最后一个Win64过顶应用程序”的所有内容都可以一起工作,在过去,现在和将来。

问题是:你真的想要吗?

因为花费数周的时间来完成其他更高级别和/或面向对象的API中可以完成的工作(并且做得更好)可能会非常激励(现实生活体验:Win API为3周,3周为4小时其他语言和/或图书馆)。

无论如何,你会发现Raymond Chen的博客非常有趣,因为他的内部人士对Win API及其多年演变的看法非常有趣:

https://blogs.msdn.microsoft.com/oldnewthing/

0
额外
你不需要使用C ++来使用win32api。你可以使用Python或其他不需要15行内存管理废话的东西,然后才能完成一项简单的任务。
额外 作者 jle,
@jle:是的,但是通过Python使用Win32 API就像通过Java或C#使用Win32 API:有人已经为您编写了包装。此外,我希望你不用Win32编写GUI,因为即使使用python,这也是一个痛苦。最后但并非最不重要的是,这个问题没有提到Python(或任何脚本语言),也没有提及“python”标签,所以......
额外 作者 paercebal,

学习C语言或更低级别的语言肯定会有用。但是,我没有看到使用非托管WinAPI有什么明显的优势。

0
额外

假设您正在构建针对Windows的应用程序:

  • 它可以确保提供有用的信息,以便了解系统的较低级别 - 它们是如何工作的,代码如何与它们交互(即使只是间接),以及在哪些地方可以使用更高级别抽象中没有的附加选项
  • 有时您的代码可能无法像您的要求一样高效,高效或足够精确
  • 然而,在越来越多的情况下,像我们这样的人(他们从来没有学过“非托管编码”)能够在没有“学习”Win32的情况下完成我们试图做的编程。此外,还有很多网站提供可以“利用”(借阅,抄袭)的工作示例,代码片段,甚至全功能源代码,但请检查您是否遵守任何重新使用许可或版权! )来填补由.NET框架类库(或您可以下载或许可的库)未处理的任何空白。
  • 如果你可以在不需要搞乱Win32的情况下完成所需要的功能,并且在开发格式良好,可读的托管代码方面做得很好,那么我认为掌握.NET将是一个更好的选择。将自己分散在两种截然不同的环境中。
  • 如果您经常需要利用尚未获得良好Framework类库覆盖率的Windows功能,那么请务必学习您所需的技能。
  • 我个人花了很多时间担心编码的“其他方面”,我认为它们理解要制作出“优秀节目”,但是那里有很多受虐狂的人,认为每个人的需求和愿望都像他们自己。苦难爱公司。 :)

On the assumption that you're building apps for the "Web 2.0" world, or that would be just as useful/beneficial to *NIX & MacOS users:

  • 坚持使用面向尽可能多的跨平台环境的语言和编译器。
  • Visual Studio中的纯.NET明显优于Win32,但是针对MONO库进行开发(可能使用Sharp Develop IDE)可能是更好的方法。
  • 你也可以花时间学习Java,而这些技能将很好地转移到C#编程中(再加上Java代码理论上可以在任何具有匹配JRE的平台上运行)。我听说它说Java更像“一次编写,无处不在调试”,但这可能与C#一样真实(甚至更多)。
0
额外