【问题标题】:How relevant is Win32 programming to modern professionals? [closed]Win32 编程与现代专业人士的相关性如何? [关闭]
【发布时间】:2010-10-05 02:50:27
【问题描述】:

作为 Charles Petzold 的书 CodeThe Annotated Turing 的忠实粉丝,我偶然发现了他的书 Programming Windows,该书教授了 C 语言中的 Win32 编程. 我是一个大一的计算机科学专业的学生,​​首先学习了 C,但是我现在使用 C# 和 .NET 进行 Windows 编程,所以我想知道 Win32 是否仍然与专业的 Windows 程序相关。作为一名想要编写 Windows 应用程序的学生,我是否值得将 Win32 API 学习到本书所涵盖的深度?

【问题讨论】:

标签: c winapi


【解决方案1】:

这实际上取决于您要开发的应用程序的种类。对于当今的大多数用途,C# 和 .NET 完全适合。但是,某些类型的应用程序需要尽可能少的依赖项(想到 shell 扩展),这对于 .NET 应用程序来说是不切实际的。对于那些你需要 Win32 的人。

与往常一样,即使您的大部分工作都使用 .NET,至少对 Win32 有基本的了解也是值得的。

【讨论】:

    【解决方案2】:

    我完全同意 Joel Spolsky 在他众多伟大的articles 之一中所写的内容。我认为了解机器的较低层不仅能够编写高质量的代码,而且能够解决不可避免地出现的问题,这一点至关重要。

    所以,是的,重要的是至少要了解 WIN32 API 的基础知识,也许不是深入了解,但至少要知道它在那里,是你将要编码的一切的基础。

    【讨论】:

    • 更高级别的 API 已经成熟。 “至少知道它在那里”可能就足够了。
    【解决方案3】:

    如果您在 Windows 上编写 C#,这非常重要。并非 Win32 的所有功能都通过 .Net 库公开。一个具体的例子是我在这里描述的 WM_SETREDRAW 消息技术:WM_SETREDRAW。在其他时候也需要它来解决控制焦点问题。

    此外,了解 Win32 和 Windows 的工作原理将使您更好地了解 C#/.Net 的各个方面,例如:

    • Control.Invoke() 实际上做了什么?
    • Control.BeginInvoke 和 Control.Invoke 有什么区别?
    • 实际上是什么导致我的控件的事件触发,例如OnClick 等,我该如何调试。

    也就是说,WPF 改变了这一切,如果您只编写 .Net 3/3.5 代码,那么我的论点就失去了一些相关性。

    【讨论】:

      【解决方案4】:

      在我看来,没有。我很久以前就学会了,所以你不必!

      我认为你先学会了 C 真是太好了,而且我会不时地继续编写 C 程序,但我不明白为什么 win32 API 会有用。老实说,这真是一团糟。

      【讨论】:

      • 嗯,肯定有一些有用的低级函数只能从wind32 api调用,即使在托管c#中也是如此
      • 是的,这是一团糟。这就是为什么了解它的方式很有用......
      • 5 年前我 100% 的时间都花在了 win32 上。现在0%。与我需要学习的其他东西相比,我不认为知道它对我每天都有帮助。它作为历史很有用,就像我脑海中的 Z80 和 6502 操作码一样。
      • 具有直接 API 编程的经验和了解 API 文档,恕我直言,这将有助于避免犯某些类型的编程错误。例如,使用来自不同线程的 GDI 对象会在所有语言和开发环境中导致问题。
      • 这是学习不使用来自不同线程的 GDI 对象的最有效方法吗?听起来像是学习种植小麦,这样你就可以做出更好的面包了。
      【解决方案5】:

      我认为学习基础知识很重要。如果你学会了显示一个带有一些字段、一些按钮和一个菜单的窗口。也许在一个单独的窗口中画一些东西。它将帮助您了解 Windows 如何真正工作的基础知识。我相信理解消息循环并认识到你所看到的几乎所有东西都是一个窗口是每个人都应该知道的基本知识。当我第一次意识到按钮是它自己的窗口时,我的眼睛真的被打开了。然后它可以帮助您了解可以通过发送这些 Windows 消息来打开和关闭事物的功能。 Subclassing windows 让您可以访问 .NET 或 VB Classic 等未向您公开的功能,并让您增强窗口的功能。

      【讨论】:

        【解决方案6】:

        一定要学习 AlexDrenea 提到的基础知识。同时 .NET 保护您免受许多 Win32 API 调用的影响。 Win32 API 如此庞大,您一定会遇到 .NET 没有为您包装它的情况。

        现实生活中的常见情况sort arrows on ListViewColumns

        【讨论】:

          【解决方案7】:

          我真的不认为“学习 Win32 API”对任何人来说都是现实的。 API(是的,不止一个)非常庞大,您几乎不需要详细了解所有这些 API。我建议阅读一些基础知识(即窗口创建、窗口消息传递、窗口过程,可能还有一些 GDI 等),并在需要时使用 MSDN 查找其余部分。

          【讨论】:

          • 我同意。即使是编写完整的 win32 应用程序的人也不知道整个事情。我想我早在 Petzold 就试过了。但我只记得我不止一次使用过的部分。
          【解决方案8】:

          根据 Greg 的评论,它在某种程度上取决于域。我做了很多 Windows CE / 移动编程,其中 .NET 对于许多设备来说过于庞大,而 MFC 等其他框架还没有完全实现。在这种情况下,Win32 的大部分内容仍然非常重要。

          也就是说,我不会提前学习所有内容,我会简单地了解基础知识,并在需要时挖掘其余部分。对于这种方法,现有的文档和示例已经足够了,诸如此类的社区提供的在线帮助也是如此。

          【讨论】:

            【解决方案9】:

            除非您需要一些 .NET Framework 中没有的功能(例如获取打印机驱动程序的详细信息),否则不需要。这大约是您将要做的事情的 99%(当然,这是我刚刚编造的任意值)。

            即使您使用的是 Win32 而不是 .NET,是否真的需要学习与本书相同的深度?浏览这些部分,了解如果您将来遇到一些问题,您知道在哪里寻找它。然后停下来。在您需要或有空闲时间时深入了解。

            【讨论】:

              【解决方案10】:

              我认为它已经得到了解答,但是如果您在 .NET 中进行 .NET 2.0 开发或任何 winforms,您肯定会遇到很多问题,即框架的某些部分如何包装 win32 和 mfc,而您需要深入研究才能真正让事情按预期工作。

              【讨论】:

              • .NET(不论版本)不包装任何 MFC 代码。
              【解决方案11】:

              如果您正在尝试解决业务问题,那么有比 C 更好的工具来编程 Win32 系统。号角。德尔福。还有一些我毫不怀疑。

              但我猜想了解事情是如何工作的你很适合使用 C。

              【讨论】:

                【解决方案12】:

                如果没有 win api 调用,有些事情是无法完成的,但随着每个版本的 .net,这些事情变得越来越少,所以不,如果我在哪里,我不会学习 win api..

                【讨论】:

                  【解决方案13】:

                  您必须知道它的存在,因为大多数“高级”托管语言的本机函数最终都会调用它们。

                  此外,它还可以封装在脚本语言中,例如 AutoitDllCall

                  【讨论】:

                    【解决方案14】:

                    我仍在使用它赚取部分收入。我们确实有一个基于 WinAPI 的 C IDE。它现在已经存在了 15 年左右,并且仍在运行;-)。它的完整下载量约为 5 MB,因为您在 .NET 世界中什么也得不到。所以对我们来说它仍然是一件有价值的事情......

                    【讨论】:

                      【解决方案15】:

                      这在Professional Win32 api Newsgroup上已经讨论过很多次了( news://comp.os.ms-windows.programmer.win32)

                      (由世界上最伟大的大师和畅销书作者(Petzold、Russinovich 等)...)

                      【讨论】:

                      • 那么,结论是什么?
                      猜你喜欢
                      • 2013-08-07
                      • 1970-01-01
                      • 2011-03-22
                      • 2015-12-07
                      • 2010-11-27
                      • 1970-01-01
                      • 2011-08-02
                      • 2011-02-21
                      • 2010-11-27
                      相关资源
                      最近更新 更多