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

是否有意义,让所有的C#pipe理的幸福,回到Petzold的编程Windows,并尝试产生的代码W /纯WinAPI?

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

这个问题与宗教接壤:)但是我会给我的想法无论如何。

我看到在学习Win32 API方面的价值。 大多数(如果不是全部的话)GUI库(托pipe或非托pipe)导致对Win32 API的调用。 即使是最全面的库也不能涵盖API的100%,因此总是存在需要通过直接API调用或P /调用来插入的差距。 API调用的一些包装名称与底层API调用具有相似的名称,但这些名称并不完全是自我logging的。 因此,理解底层API以及其中使用的术语将有助于理解封装API以及它们实际上做了些什么。

此外,如果您了解框架所使用的基础API的性质,那么您将针对特定场景中应使用哪些库function做出更好的select。

干杯!

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

一方面Win32 API非常酷。 它就像是C标准API的扩展(当你可以使用CreateFile时候需要fopen ,但是我猜UNIX / Linux / WhateverOS有相同的Gizmofunction,无论如何,在Unix / Linux下,它们都是“一切都是文件”。在Windows中,他们有“一切都是一个…窗口”(不要开玩笑!见CreateWindow !)。

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

  • 就像告诉一个人的结构自己的大小来通过void *指针来传递一些Win32函数。
  • 消息传递也可能相当混乱:将C ++对象与Win32窗口混合导致鸡或鸡蛋问题的非常有趣的例子(当你写一种delete this ;在类方法中有趣的时刻)。
  • 当你更熟悉对象inheritance时,必须对WinProc进行子类化,这是头痛的事情,并不是最理想的。
  • 当然,“ 为什么在这个压裂的世界里,他们这样做了这个事情呢? ”当你用太多的头敲击键盘的时候,用额头上刻着的钥匙回到家,只是因为有人认为编写一个API来更改“窗口”的颜色更合乎逻辑,而不是通过改变它的一个属性,而是通过询问它的父窗口。
  • 等等

最后( 三只手? ),考虑一些使用遗留API的人自己使用遗留代码样式。 当你听到“ const是傻瓜 ”或“ 我不使用命名空间,因为它们会降低运行速度 ”,或者更好的“ 嘿,谁需要C ++?我用自己的品牌面向对象的C编码! ! “(不要开玩笑……在一个专业的环境里,结果是相当的…),你会感到恐惧的那种恐惧,只能在断头台前受到谴责。

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

编辑

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

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

问题是:你真的想要吗?

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

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

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

本地API是“真实的”操作系统API。 .NET库(除了less数例外)只不过是一个花哨的包装器而已。 所以是的,我会说任何能够理解.NET复杂性的人都可以理解相对平凡的东西,比如在没有中间人的帮助下与API交谈。

试着从托pipe代码做DLL注入。 这是不能做到的。 你将被迫为此编写本地代码,用于窗口调整,真正的子类化以及其他一些事情。

所以是的:你应该(必须)都知道。

编辑:即使你打算使用P / Invoke。

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

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

  • 它可以肯定地提供信息来理解系统的较低层次 – 它们是如何工作的,代码如何与它们交互(即使是间接的),以及在哪里有更多的选项在更高级别的抽象中不可用
  • 有时候你的代码可能不会像你的要求一样高效,高性能或足够精确
  • 然而,在越来越多的情况下,像我们这样的人(他们从来没有学过“非托pipe编码”)将能够在不学习Win32的情况下完成我们所要做的编程。
  • 此外,还有大量网站提供工作示例,代码片段,甚至可以“利用”(借阅,抄袭,但检查您是否遵守任何重新使用许可或版权)的全function源代码以填充在.NET框架类库(或者您可以下载或许可的库)不处理的任何空隙中。
  • 如果你能在Win32中完成所需的function,而且你在开发格式良好,可读的托pipe代码方面做得很好,那么我认为掌握.NET将是一个更好的select,在两个非常不同的环境。
  • 如果您经常需要利用尚未获得良好框架类库覆盖的Windowsfunction,那么请务必学习您所需的技能。
  • 我个人花了太多的时间来担心编程的“其他领域”,而我应该理解这个领域是为了制作出“优秀的程序”,但是那里有很多受虐狂的人认为每个人的需求和愿望都是自己的。 苦难爱公司。 🙂

假设您正在为“Web 2.0”世界构build应用程序,或者对于NIX和MacOS用户来说,这些应用程序是有用/有益的:

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

比喻:如果你为生存(编程)而生产汽车,那么就知道它是如何工作的(Win32)。

简单的答案,是的。

这是任何问题的答案就像.. “即使当更高级的语言/ API是在那里学习低级语言/ API X是否有意义”

你可以启动你的Windows PC(或任何其他操作系统),并在SO中提出这个问题,因为微软的几个人写了16位汇编代码来加载你的操作系统。

你的浏览器工作是因为有人用C语言编写了一个满足浏览器请求的操作系统内核。

它一直到脚本语言。

无论大小,总是有一个市场和机会来写任何抽象层次的东西。 你只需要喜欢它,适合正确的工作。

在任何抽象层面上,没有任何API /语言是无关紧要的, 除非在同一层次上有更好的抽象。

另一种看待它的方式:迈克尔·阿布拉什(Michael Abrash)的书中的一个很好的例子:AC程序员被赋予了编写清除屏幕function的任务。 由于C是一个更好(更高级别)的汇编和全部抽象,所以程序员只知道C并且知道它。 他尽了最大的努力 – 将光标移动到屏幕上的每个位置,并清除那里的angular色。 他优化了循环,并确保它尽可能快地运行。 但仍然是缓慢的…直到有人进来说,有一些BIOS / VGA指令或可以立即清除屏幕的东西。

这总是有助于知道你在走什么。

是的,有几个原因:

1).net包装Win32代码。 .net通常是一个优秀的代码对抗系统,但是具有底层Win32层的一些知识(oops,现在有64位代码的WinAPI)可以增强你对真正发生的事情的了解。

2)在这个经济体中,当你找工作的时候,最好还是比别人有优势。 一些WinAPI的经验可能会为你提供这个。

3).net框架还没有一些系统方面的function,如果你想访问这些function,你需要使用p / invoke(请参阅http://www.pinvoke.net获得一些帮助)。; 至less有一点点的WinAPI经验会使你的p / invoke开发工作更有效率。

4)(已添加)既然Win8已经有一段时间了,它仍然是build立在WinAPI之上的。 iOS,Android,OS / X和Linux都在外面,但是WinAPI仍然会在很多年。

学习新的编程语言或技术是出于以下三个原因之一:
1.需要:您正在开始一个构buildWeb应用程序的项目,并且您对ASP.NET没有任何了解
2.热情:你对ASP.NET MVC非常兴奋。 为什么不尝试呢?
空闲时间:但是谁有这个。

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

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

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

通过学习如何与Win32 API进行互操作,如果你使用桌面编程,你将会获得很大的帮助,因为当你需要调用Win32的时候,你将不会花费数周的时间。

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

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

我已经看到低级的Windows API代码…这不是很漂亮…我希望我可以忘掉它。 我认为学习C语言的低级别是有好处的,因为您可以更好地理解硬件体系结构以及所有这些东西的工作原理。 学习旧的Windows API …我认为,这些东西可以留给微软的人,他们可能需要学习它来构build更高级的语言和API …他们build立它,让他们受苦;-)

然而,如果你碰巧发现一种情况,你觉得自己不能用高级语言(很less或者很远)做你所需要做的事情,那么也许开始危险的潜水到这个世界。

是。 看看uTorrent,一个惊人的软件效率。 其中一半的规模很小,原因在于它的核心组件大部分被重新编写为不使用gargatuian库。

如果不了解这些库如何与低级API进行交互,大部分工作是无法完成的

知道Windows API有什么是很重要的。 我不认为你需要用它来代码,但你应该知道它是如何工作的。 .NET Framework包含许多function,但不提供整个Windows API的托pipe代码等效项。 有时候你需要更加接近金属,并且知道下面的情况以及它的performance会让你更好地理解如何使用它。

我真的应该学习像C语言(甚至汇编语言)这样的低级语言。

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

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

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

学习Win32 API所获得的价值(除了从学习机器的螺母和螺栓是如何结合在一起而获得的一般洞察力之外)取决于你想要达到的目标。 很多Win32 API已经很好地包装在.NET库类中,但不是全部。 如果你想要做一些严肃的audio编程,Win32 API的这一部分将是一个很好的学习主题,因为从.NET类只有最基本的操作。 最后,我检查了即使是托pipeDirectX的DirectSound库是可怕的。


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

我刚遇到一个情况,Win32 API是我唯一的select。 我想对列表框中的每个项目有不同的工具提示。 我在这个问题上写了我是如何做到的。

即使是非常高级的语言,您仍然可以使用API​​。 为什么? 那么不是API的每个方面都被各种库,框架等复制了。只要您需要API来完成您正在尝试的操作,就需要学习API。 (不再)。

除了一些非常特殊的情况,当你需要直接访问API时,我会说NO。

学习正确实现本地API调用需要花费相当多的时间和精力,返回的值是不值得的。 我宁愿花时间学习一些新的热门技术或框架,这将使您的生活更轻松,编程更less痛苦。 没有几十年陈旧的COM库,没有人真正使用了(抱歉给COM用户)。

请不要因为这个观点而让我受伤。 我知道很多工程师真的很好奇,学习工作是没有问题的。 好奇心好,真的有助于理解。 但从pipe理的angular度来看,我宁愿花一个星期的时间学习如何开发Android应用程序,而不是如何调用OLE或COM。

如果您打算开发一个跨平台的应用程序,如果您使用win32,那么您的应用程序可以通过WINE轻松地在Linux上运行。 这导致了高度可维护的应用程序。 这是学习win32的好处之一。