关于Windows:学习低级WinAPI编程仍然有意义吗?

关于Windows:学习低级WinAPI编程仍然有意义吗?

Does it still make sense to learn low level WinAPI programming?

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

从中学到什么? 难道不是太有用了吗?


这个问题与宗教有关:)但是我还是会考虑一下。

我确实了解了学习Win32 API的价值。大多数(如果不是全部)GUI库(托管或非托管)都会导致对Win32 API的调用。即使是最完善的库也无法覆盖100%的API,因此,总是存在需要通过直接API调用或P /调用来填补的空白。 API调用周围的一些包装器名称与基础API调用具有相似的名称,但这些名称并非完全是自记录的。因此,了解底层API以及其中使用的术语,将有助于了解包装器API及其实际功能。

另外,如果您了解框架所使用的基础API的性质,那么在给定方案中应使用哪种库功能方面,您将做出更好的选择。

干杯!


在学习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窗口混合使用会引发非常有趣的Chicken或Egg问题示例(在类方法中编写delete this ;类型时很有趣)。
  • 当您对对象继承更加熟悉时,必须对WinProc进行子类化,这很麻烦,而且并非最佳选择。
  • 当然,还有"为什么在这个脆弱的世界中他们以这种方式做这件事?"的喜悦。当您用头部多次敲击键盘并用刻在额头上的键回到家的那一刻,仅仅是因为有人认为编写API来启用"窗口"的颜色更改更合乎逻辑,而不是通过更改它的属性之一,但要求其返回其父窗口。
  • 等等

在最后一手(三手???)中,请考虑使用旧版API的一些人本身正在使用旧版代码样式。当您听到" const是傻瓜"或"我不使用名称空间,因为它们降低了运行速度"或什至更好的"嘿,谁需要C ++?我用自己的面向对象的C语言编写代码"时!!!" (不要开玩笑……在专业的环境中,结果真是让人眼前一亮……),您会感觉到断头台前那种只怕被谴责的感觉。

所以...总而言之,这是一次有趣的经历。

编辑

重新阅读这篇文章后,我认为它可能被认为是过于消极的。它不是。

知道事物在幕后如何工作有时很有趣(同时令人沮丧)。您将了解,尽管存在巨大的(不可能的)约束,但Win32 API团队做了出色的工作,以确保从"旧版Win16程序"到"最后一个Win64顶置应用程序"的所有东西都能协同工作,在过去,现在和将来。

问题是:您真的要吗?

因为花数周的时间去做可以在其他更高级的和/或面向对象的API中可以做的事情(并且做得更好)可能会降低工作动力(现实生活中:Win API需要3周,而三分之四其他语言和/或库)。

无论如何,您会发现Raymond Chen的Blog非常有趣,因为他的内部人士对Win API及其多年来的发展看法:

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


本机API是"实际"操作系统API。 .NET库(几乎没有例外)不过是围绕它们的精美包装。所以是的,我想说的是,任何可以理解.NET复杂性的人都可以理解相对平凡的事情,例如与API交谈而无需中间人的帮助。

只需尝试从托管代码执行DLL注入。不能做您将被迫为此编写本机代码,进行窗口调整,进行真正的子类化以及许多其他事情。

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

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


绝对。当没人知道低级语言时,谁会更新和编写高级语言?另外,当您了解低级内容时,可以使用高级语言编写更高效的代码,并且也可以更高效地进行调试。


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

  • 理解较低级别的系统肯定是很有帮助的-它们如何工作,代码如何与它们交互(即使只是间接地)以及在何处还有高层抽象中没有的其他选项
  • 有时您的代码可能不够高效,高性能或不够精确,无法满足您的要求
  • 但是,在越来越多的情况下,像我们这样的人(他们从未学习过"非托管编码")可以在不"学习" Win32的情况下进行我们尝试做的编程。
  • 此外,还有许多站点提供了工作样本,代码片段,甚至是功能齐全的源代码,您可以"利用"(借用,窃-但检查您是否遵守任何重复使用许可或版权!)进行填充.NET框架类库(或您可以下载或许可的库)无法处理的任何空白。
  • 如果您可以在Win32中轻松完成所需的功能,并且在开发格式良好,可读性强的托管代码方面做得很好,那么我想精通.NET会比精打细算成为更好的选择。在两个非常不同的环境中。
  • 如果您经常需要利用Windows那些尚未获得Framework类库良好介绍的功能,那么一定要学习所需的技能。
  • 我个人花了太多时间来担心我应该理解的编码的"其他领域",以产生"好的程序",但是那里有很多受虐狂,认为每个人的需求和欲望都是他们自己的。痛苦爱公司。 :)

假设您正在为" Web 2.0"世界构建应用程序,或者对* NIX和MacOS用户同样有用/受益:

  • 坚持使用针对尽可能多的跨平台环境的语言和编译器。
  • 显然,Visual Studio中的纯.NET比Win32更好,但是也许使用Sharp Develop IDE针对MONO库进行开发可能是一种更好的方法。
  • 您还可以花时间学习Java,这些技能可以很好地转移到C#编程中(并且Java代码理论上可以在具有匹配JRE的任何平台上运行)。我听说它说Java更像是"一次编写,到处调试",但这可能与C#一样真实(甚至比C#还真实)。

打个比方:如果您以汽车为生(编程),那么了解发动机的工作原理(Win32)非常相关。


简单的答案,是的。


这是对任何类似问题的答案。"即使有高级语言/ api Y,学习低级语言/ api X还是有意义的"

您可以启动Windows PC(或任何其他操作系统),并在SO中询问此问题,因为Microsoft的几个人编写了16位汇编代码来加载OS。

您的浏览器之所以有效,是因为有人用C语言编写了一个OS内核,可以满足您所有浏览器的请求。

一直到脚本语言。

无论大小,总有一个市场和机会来编写任何抽象级别的内容。您只需要喜欢它并适合合适的工作即可。

除非有更好的API或语言在同一级别进行竞争,否则任何抽象级别的api /语言都是无关紧要的。

另一种看待它的方式:迈克尔·阿布拉什(Michael Abrash)书中的一个很好的例子:C程序员被赋予编写清除屏幕功能的任务。由于C是比汇编语言和所有语言更好的(更高层次的)抽象,因此程序员仅了解C并且非常了解C。他尽力了-他将光标移动到屏幕上的每个位置并清除了那里的字符。他优化了循环,并确保其尽可能快地运行。但是仍然很慢...直到有人进来并说有一些BIOS / VGA指令或可以立即清除屏幕的内容。

了解您所走的路总是有帮助的。


是的,原因如下:

1).net包装Win32代码。 .net通常是比较好的系统,但是对底层Win32层有一些了解(哎呀,现在也有64位代码的WinAPI),可以增强您对实际情况的了解。

2)在这种经济形势下,找工作时要比其他人更好一些。某些WinAPI经验可能会为您提供此服务。

3).net框架尚无法使用某些系统方面的功能,如果要访问这些功能,则需要使用p / invoke(有关帮助,请参阅http://www.pinvoke.net)。至少需要一点WinAPI经验,才能使p / invoke开发工作更加有效。

4)(添加)现在Win8已经存在了一段时间,它仍然基于WinAPI构建。 iOS,Android,OS / X和Linux都已存在,但WinAPI仍将存在许多年。


学习新的编程语言或技术是出于以下三个原因之一:
1.需求:您正在启动一个用于构建Web应用程序的项目,并且对ASP.NET一无所知
2.热情:您对ASP.NET MVC感到非常兴奋。为什么不试试呢?
3.空闲时间:但是谁有时间。

学习新事物的最好理由是极品。如果您需要做.NET框架无法做的事情(例如性能),那么WinAPI是您的解决方案。在此之前,我们一直致力于学习.NET。


我个人并不真的喜欢Win32 API,但是学习它很有价值,因为与Visual Basic这样的语言相比,该API将允许使用GUI进行更多的控制和提高效率,我相信如果您打算制作一款实用的编写软件即使您不直接使用它,也应该了解该API。这样做的原因与学习C语言的好处类似,例如strcpy比复制整数花费更多的时间,或者为什么应将指向数组的指针用作函数参数而不是按值数组。


对于台式机上的大多数需求,您将不需要了解Win32,但是.NET中没有很多Win32,但是它是在最终的东西中,最终可能会少于应用程序的1%。

USB支持,HID支持,Windows Media Foundation只是我的头等大事。只有Win32提供了许多很酷的Vista API。

如果您进行桌面编程,您将通过学习如何与Win32 API互操作来大获全胜,因为当您确实需要调用Win32时,您将不会花费数周的时间挠头。


是。看一下uTorrent,这是惊人的软件效率。它一半的体积很小是因为它的许多核心组件都被重写为不使用gargatuian库。

如果不了解这些库如何与较低级别的API交互,就无法完成很多工作


我已经看到了低级的Windows API代码...这不是很漂亮...我希望我可以不学习它。我认为学习C语言中的低级课程会有所帮助,因为您可以更好地了解硬件体系结构以及所有这些东西的工作原理。学习旧的Windows API ...我认为可以把东西留给Microsoft的人们,他们可能需要学习它来构建高级语言和API ...他们构建了它,让他们受苦;-)

但是,如果您碰巧发现自己感觉自己无法用高级语言(几乎没有)来做您需要做的事情,那么也许就开始危险地跳入那个世界。


学习C或较低级别的语言绝对有用。但是,在使用非托管WinAPI时,我看不出任何明显的优势。


除了需要直接访问API的一些非常特殊的情况外,我会说不。

学习正确实现本机API调用需要花费大量时间和精力,而返回值却不值得。我宁愿花时间学习一些新的热门技术或框架,这些新技术或框架将使您的生活更轻松,并且减轻编程的痛苦。没有几十年来已经没有人真正使用过的过时的COM库(对COM用户表示抱歉)。

请不要为这个观点而烦恼我。我知道这里的许多工程师真的很好奇,学习事物的工作原理也没有错。好奇心很好,确实有助于理解。但是从管理角度来看,我宁愿花一个星期学习如何开发Android应用程序,而不是如何调用OLE或COM。


如果我要学习像C(或什至是汇编程序)这样的低级语言,这与问题是一样的。

编码当然较慢(尽管结果当然要快得多),但其真正的优势是您可以洞悉接近系统级别的情况,而不仅仅是了解别人对正在发生的事情的隐喻。 。

当事情运行不正常,运行速度不够快或具有所需的粒度时,也可能会更好。 (并且至少要进行一些子类化和超类化。)


重要的是要了解Windows API的可用功能。我认为您不需要使用它来编写代码,但是您应该知道它是如何工作的。 .NET Framework包含许多功能,但没有为整个Windows API提供等效的托管代码。有时您必须离金属更近一些,知道那里的金属及其行为会更好地了解如何使用它。


我这样说。我不喜欢对Win32 API进行编程。与托管代码相比,这可能会很痛苦。但是,我很高兴知道这一点,因为我可以编写否则无法实现的程序。我可以编写其他人不能编写的程序。此外,它还使您可以更深入地了解托管代码在后台执行的操作。


通过学习Win32 API所获得的价值(除了通过学习有关机器的螺母和螺栓如何配合而获得的一般见解之外)还取决于您要实现的目标。许多Win32 API已很好地包装在.NET库类中,但并非全部。例如,如果您要进行认真的音频编程,则Win32 API的那部分将是一个很好的学习主题,因为.NET类仅提供最基本的操作。最后,我检查了托管DirectX DirectSound库是否糟糕。

冒着无耻自我促进的风险。

我刚遇到Win32 API是我唯一的选择的情况。我想在列表框中的每个项目上使用不同的工具提示。我写下了我是如何解决这个问题的。


即使使用非常高级的语言,您仍然可以使用API??。为什么?嗯,并不是所有库,框架等都复制了API的每个方面。只要需要API来完成您想做的事情,就需要学习API。 (并且不再。)


如果打算开发跨平台应用程序,则使用Win32,则可以通过WINE在Linux上轻松运行应用程序。这导致了高度可维护的应用程序。这是学习win32的优点之一。


推荐阅读