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

可以从中学到什么? 是不是太过时了有用?

===============>>#1 票数:61 已采纳

这个问题接近于宗教:)但无论如何我会给出我的想法。

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

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

干杯!

===============>>#2 票数:22

在学习Win32 API之前,我保持标准的C / C ++多年,而且直言不讳,“学习Win32 API”部分并不是我生命中最好的技术经验。

一方面Win32 API非常酷。 它就像是C标准API的扩展(当你可以使用CreateFile时需要fopen 。但我猜UNIX / Linux / WhateverOS具有相同的Gizmo功能。无论如何,在Unix / Linux中,它们都有“Everything is a file”。在Windows中,他们有“一切都是......窗口”(不开玩笑!请参阅CreateWindow !)。

另一方面,这是一个遗留API。 你将处理原始C和原始C疯狂。

  • 就像告诉一个人的结构自己的大小来传递一个指向某个Win32函数的void *指针。
  • 消息传递也可能非常令人困惑:将C ++对象与Win32窗口混合会导致鸡或蛋问题的非常有趣的例子(当你写一种delete this ;时的有趣时刻delete this ;在类方法中)。
  • 当你更熟悉对象继承时,必须继承WinProc是头分裂而不是最优。
  • " moments when you strike your keyboard with your head once too many and get back home with keys engraved in your forehead, just because someone thought it more logical to write an API to enable the changing of the color of a "Window", not by changing one of its properties, but by asking it to its parent window. 当然,有一种乐趣是“ ”当你用太多的头撞到你的键盘然后用你的额头上刻有钥匙回家的时候,只是因为有人认为编写API以更改“窗口”的颜色更合乎逻辑,而不是通过更改其中一个属性,而是通过询问它的父窗口。
  • 等等

), consider that some people working with legacy APIs are themselves using legacy code styling. 在最后一手( )中,考虑一些使用遗留API的人自己使用遗留代码样式。 " or " ", or the even better " " (No kidding... In a professional environment, and the result was quite a sight...), you'll feel the kind of dread only condemned feel in front of the guillotine . 你听到“ ”或“ ”的那一刻,或者甚至更好的“ 别开玩笑了......在一个专业的环境,结果是相当的视线......),你会感觉到那种恐惧只是在前面谴责感觉断头台

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

编辑

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

知道如何在幕后工作是有趣的(也是令人沮丧的)。 你会明白,尽管存在巨大的(不可能的?)约束,但Win32 API团队确实做了很多工作,以确保从“olde Win16程序”到“最后的Win64 over-the-top应用程序”的所有内容都可以一起工作,在过去,现在和将来。

问题是:你真的想要吗?

因为在其他更高级别和/或面向对象的API中花费数周时间来完成可以完成(并且做得更好)的事情可能会非常缺乏动力(实际体验:Win API为3周,3个为4小时)其他语言和/或图书馆)。

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

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

===============>>#3 票数:16

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

===============>>#4 票数:16

本机API是“真正的”操作系统API。 .NET库(除了极少数例外)只不过是一个奇特的包装器。 所以,是的,我会说任何能够理解.NET复杂性的人都可以理解相对平凡的事情,比如在没有中间人的情况下与API交谈。

只是尝试从托管代码执行DLL注入。 它无法完成。 您将被迫为此编写本机代码,用于窗口调整,实际子类化以及其他十几项操作。

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

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

===============>>#5 票数:11

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

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

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

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

===============>>#6 票数:9

打个比方:如果你以生活(编程)为基础制造汽车,那么了解发动机是如何工作的(Win32)是非常恰当的。

===============>>#7 票数:8

简单的回答,是的。

===============>>#8 票数:7

是的,原因如下:

1).net包装Win32代码。 .net通常是一个优秀的代码编写系统,但是对底层Win32层有一定的了解(oops,WinAPI,现在也有64位代码),可以增强你对真实情况的了解。

2)在这种经济形势下,当你找工作时,最好比其他人有一些优势。 一些WinAPI体验可能会为您提供此功能。

3)某些系统方面尚未通过.net框架提供,如果您想访问这些功能,则需要使用p / invoke(请参阅http://www.pinvoke.net以获得一些帮助)。 拥有至少一小部分WinAPI经验将使您的p / invoke开发工作更加高效。

4)(已添加)现在Win8已经存在了一段时间,它仍然建立在WinAPI之上。 iOS,Android,OS / X和Linux都在那里,但WinAPI仍将存在很多年。

===============>>#9 票数:7

这就是任何类似问题的答案。 “即使有更高级别的语言/ api Y,学习低级语言/ api X也是有意义的”

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

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

它一直到脚本语言。

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

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

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

知道你在走什么总是有帮助的。

===============>>#10 票数:4

我个人并不喜欢Win32 API,但学习它有价值,因为使用GUI可以比使用Visual Basic这样的语言实现更多的控制和效率,而且我相信如果你要以写软件为生即使您不直接使用API​​,也应该知道它。 这是因为类似于学习C的原因,比如strcpy如何比复制整数花费更多的时间,或者为什么你应该使用指向数组的指针作为函数参数而不是按值来表示数组。

===============>>#11 票数:4

学习新的编程语言或技术有以下三个原因之一:
1.需要:您正在开始构建Web应用程序的项目,而您对ASP.NET一无所知
2.热情:你对ASP.NET MVC非常兴奋。 为什么不试试呢?
3.空闲时间:但无论如何谁都有。

学习新东西的最佳理由是极品。 如果您需要执行.NET框架无法执行的操作(例如性能),那么WinAPI就是您的解决方案。 在那之前,我们一直忙着学习.NET

===============>>#12 票数:4

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

USB支持,HID支持,Windows Media Foundation刚刚脱颖而出。 Win32提供了许多很酷的Vista API。

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

===============>>#13 票数:3

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

===============>>#14 票数:3

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

但是,如果你碰巧找到一种情况,你觉得你不能用更高级别的语言(少数和远程)做你需要做的事情,那么也许开始危险的潜入那个世界。

===============>>#15 票数:3

是。 看看uTorrent,一个惊人的软件效率。 其中一半的小尺寸是因为它的大部分核心组件被重写为不使用gargatuian库。

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

===============>>#16 票数:2

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

学习正确实现本机API调用需要花费大量的时间和精力,返回的值不值得。 我宁愿花时间学习一些新的热门技术或框架,让你的生活更轻松,编程也更少痛苦。 不是几十年前过时的COM库,没有人真正使用它(对COM用户来说很抱歉)。

请不要嘲笑我这个观点。 我知道这里的很多工程师都有很好奇的灵魂,学习如何运作并没有错。 好奇是好的,真的有助于理解。 但从管理的角度来看,我宁愿花一周时间学习如何开发Android应用程序而不是如何调用OLE或COM。

===============>>#17 票数:2

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

===============>>#18 票数:2

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

===============>>#19 票数:2

学习Win32 API所获得的价值,(除了从了解机器的螺母和螺栓如何组合在一起的各种一般见解之外)取决于你想要达到的目标。 很多Win32 API已经很好地包装在.NET库类中,但不是全部。 例如,如果您正在寻找一些严肃的音频编程,那么Win32 API的这一部分将是一个很好的学习主题,因为只有最基本的操作可以从.NET类中获得。 最后我检查了托管的DirectX DirectSound库很糟糕。


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

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

===============>>#20 票数:2

了解Windows API的可用内容非常重要。 我不认为你需要用它来编写代码,但你应该知道它是如何工作的。 .NET Framework包含许多功能,但它不提供整个Windows API的托管代码等效项。 有时你必须更接近金属,知道那里的东西以及它的行为将使你更好地理解如何使用它。

===============>>#21 票数:2

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

其中的编码肯定较慢(虽然结果当然要快得多),但它的真正优势在于您可以深入了解接近系统级别的情况,而不仅仅是了解其他人对正在发生的事情的隐喻。 。

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

===============>>#22 票数:1

如果您计划开发跨平台应用程序,如果您使用win32,那么您的应用程序可以通过WINE在Linux上轻松运行。 这导致高度可维护的应用程序。 这是学习win32的优势之一。

  ask by Camilo Díaz Repka translate from so

未解决问题?本站智能推荐: