学习低级WinAPI编程仍然有意义吗?
在拥有所有C#管理的幸福的情况下,回到Petzold的Programming Windows并尝试生成带有纯WinAPI的代码是否有意义?
从中学到什么?难道不是太有用了吗?
解决方案
回答
绝对地。当没人知道低级语言时,谁会更新和编写高级语言?另外,当我们了解低级内容时,可以使用高级语言编写更有效的代码,并且也可以更高效地进行调试。
回答
学习C或者较低级别的语言绝对有用。但是,我看不到使用非托管WinAPI的任何明显优势。
回答
我看过低级的Windows API代码...不太漂亮...我希望我可以不学习它。我认为学习C语言中的低水平课程会有所帮助,因为我们可以更好地了解硬件体系结构以及所有这些东西的工作原理。学习旧的Windows API ...我认为可以把东西留给Microsoft的人们,他们可能需要学习它来构建高级语言和API ...他们构建了它,让他们受苦;-)
但是,如果我们碰巧发现自己感觉自己无法用高级语言(几乎没有)完成我们需要做的事情,那么也许就开始危险地跳入那个世界。
回答
本机API是"实际"操作系统API。 .NET库(几乎没有例外)不过是围绕它们的精美包装。因此,是的,我想说的是,任何能够理解.NET及其所有复杂性的人都可以理解相对平凡的事情,例如与API交谈而无需中间人的帮助。
只需尝试从托管代码执行DLL注入。不能做我们将被迫为此编写本机代码,进行窗口调整,进行真正的子类化以及许多其他事情。
所以是的:我们应该(必须)都知道。
编辑:即使我们打算使用P / Invoke。
回答
这个问题与宗教有关:)但是我还是会考虑一下。
我确实了解了学习Win32 API的价值。大多数(如果不是全部)GUI库(托管或者非托管)都会导致对Win32 API的调用。即使是最完善的库也无法覆盖100%的API,因此,始终存在需要通过直接API调用或者P /调用来填补的空白。 API调用周围的一些包装器名称与基础API调用具有相似的名称,但这些名称并非完全是自记录的。因此,了解底层API以及其中使用的术语,将有助于了解包装器API及其实际功能。
另外,如果我们了解框架所使用的基础API的性质,那么在给定方案中应使用哪种库功能方面,我们将做出更好的选择。
干杯!
回答
打个比方:如果我们以汽车为生(编程),那么了解引擎的工作原理(Win32)非常相关。
回答
简单的答案,是的。
回答
学习新的编程语言或者技术是出于以下三个原因之一:
1.需求:我们正在启动一个用于构建Web应用程序的项目,而我们对ASP.NET一无所知
2.热情:我们对ASP.NET MVC感到非常兴奋。为什么不试试呢?
3.空闲时间:但是谁有时间。
学习新事物的最好理由是极品。如果我们需要做.NET框架无法做的事情(例如性能),那么WinAPI是解决方案。在此之前,我们将全神贯注于学习.NET
回答
重要的是要了解Windows API的可用功能。我认为我们不需要使用它来编写代码,但是我们应该知道它是如何工作的。 .NET Framework包含许多功能,但没有为整个Windows API提供等效的托管代码。有时我们必须离金属更近一些,知道那里的金属及其行为会更好地了解如何使用它。
回答
对于台式机上的大多数需求,我们将不需要了解Win32,但是.NET中没有很多Win32,但是它是在支出中,最终可能少于应用程序的1%。
USB支持,HID支持,Windows Media Foundation只是我的头等大事。只有Win32提供了许多很酷的Vista API。
如果我们进行桌面编程,我们将通过学习如何与Win32 API互操作来大获全胜,因为当我们确实需要调用Win32时,我们将不会花费数周的时间挠头。
回答
假设我们要构建针对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,但是学习它很有价值,因为与Visual Basic这样的语言相比,该API将允许使用GUI进行更多的控制和提高效率,我相信如果我们打算制作一款实用的书写软件即使我们不直接使用它,也应该了解该API。这样做的原因与学习C语言的好处类似,例如strcpy比复制整数花费更多的时间,或者为什么应将指向数组的指针用作函数参数而不是按值数组。
回答
如果我要学习像C(甚至汇编程序)这样的低级语言,这与问题实际上是相同的。
编码当然较慢(尽管结果当然要快得多),但是其真正的优势是我们可以洞悉接近系统级别的情况,而不仅仅是了解别人对正在发生的事情的隐喻。
当事情运行不正常,运行速度不够快或者达到我们所需的粒度时,也可能会更好。 (并且至少要进行一些子类化和超类化。)
回答
在学习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窗口混合会导致非常有趣的鸡肉或者鸡蛋问题示例(在类方法中编写"删除此;"时很有趣)。
- 当我们更熟悉对象继承时,必须将WinProc子类化,这会让人头昏脑胀,而且不是最佳选择。
- 当然,还有"为什么在这个脆弱的世界中他们以这种方式来做这件事?"的乐趣。当我们用头部多次敲击键盘并用刻在额头上的键回到家的那一刻,仅仅是因为有人认为编写API来启用"窗口"的颜色更改更合乎逻辑,而不是通过更改它的属性之一,但要求其返回其父窗口。
- 等等。
在最后一手(三手???)中,请考虑一些使用旧版API的人本身正在使用旧版代码样式。当我们听到"const
代表假人"或者"我不使用名称空间,因为它们降低了运行速度"或者什至更好的"嘿,谁需要C ++?我用自己的面向对象的C语言编写代码!!!" (不要开玩笑……在专业的环境中,结果真是让人眼前一亮……),我们会感觉到断头台前那种只怕被谴责的感觉。
所以,总而言之,这是一次有趣的经历。
编辑
重新阅读这篇文章后,我认为它可能被认为是过于消极的。它不是。
知道事物在幕后是如何工作有时很有趣(而且令人沮丧)。我们将了解,尽管存在巨大的(不可能的)限制,但Win32 API团队做了出色的工作,以确保从"旧版Win16程序"到"最后一个Win64顶置应用程序"的所有东西都可以协同工作,在过去,现在和将来。
问题是:我们真的要吗?
因为花数周的时间去做可以在其他更高级的和/或者面向对象的API中可以做的事情(并且做得更好)可能会很消极(现实生活中:Win API为3周,而三分之四则为4小时)其他语言和/或者库)。
无论如何,我们会发现Raymond Chen的Blog非常有趣,因为他的内部人士对Win API及其多年来的发展看法:
https://blogs.msdn.microsoft.com/oldnewthing/
回答
我这样说。我不喜欢对Win32 API进行编程。与托管代码相比,这可能会很痛苦。但是,我很高兴知道这一点,因为我可以编写否则将无法执行的程序。我可以编写其他人不能编写的程序。此外,它还使我们可以更深入地了解托管代码在后台执行的操作。
回答
通过学习Win32 API所获得的价值(除了通过学习有关机器的螺母和螺栓如何配合而获得的一般见解之外)还取决于我们要实现的目标。许多Win32 API已很好地包装在.NET库类中,但并非全部。例如,如果我们要进行认真的音频编程,则Win32 API的那部分将是一个很好的学习主题,因为.NET类仅提供最基本的操作。最后,我检查了托管DirectX DirectSound库是否糟糕。
冒着无耻的自我促进的风险。
我刚遇到Win32 API是我唯一的选择的情况。我想在列表框中的每个项目上使用不同的工具提示。我写下了如何在这个问题上做到这一点。
回答
是的。看一下uTorrent,这是惊人的软件效率。它一半的体积很小是因为它的许多核心组件都被重写为不使用gargatuian库的事实。
如果不了解这些库如何与较低级别的API交互,就无法完成许多工作
回答
即使使用非常高级的语言,我们仍然可以使用API。为什么?很好,并不是所有库,框架等都复制了API的每个方面。只要需要API来完成我们想做的事情,就需要学习API。 (并且不再。)
回答
如果打算开发跨平台应用程序,则使用Win32,则可以通过WINE在Linux上轻松运行应用程序。这导致了高度可维护的应用程序。这是学习win32的优点之一。
回答
是的,原因如下:
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仍将存在许多年。
回答
这是对任何类似问题的答案。"即使存在高级语言/ api Y,学习低级语言/ api X还是有意义的"
是的
我们能够启动Windows PC(或者任何其他操作系统),并在SO中询问此问题,因为Microsoft的几个人编写了加载OS的16位汇编代码。
浏览器之所以有效,是因为有人用C语言编写了一个OS内核,可以满足我们所有浏览器的请求。
一直到脚本语言。
无论大小,总有一个市场和机会可以编写任何抽象级别的内容。我们只需要喜欢它并适合合适的工作即可。
除非有更好的API /语言在同一级别进行竞争,否则任何抽象级别的api /语言都是无关紧要的。
另一种看待它的方式:迈克尔·阿布拉什(Michael Abrash)书中的一个很好的例子:C程序员被赋予编写清除屏幕功能的任务。由于C是比汇编语言和所有语言更好的(更高层次的)抽象,因此程序员仅了解C并且非常了解C。他竭尽所能,将光标移到屏幕上的每个位置并清除了那里的字符。他优化了循环,并确保其尽可能快地运行。但是仍然很慢...直到有人进来并说有一些BIOS / VGA指令或者可以立即清除屏幕的内容。
知道我们所走的路总是有帮助的。