52 votes

Est-il toujours utile d’apprendre la programmation WinAPI de bas niveau?

Est-il judicieux, après avoir tout le bonheur d'être géré en C #, de revenir à la fenêtre de programmation de Petzold et d'essayer de produire du code avec WinAPI pur?

Que peut-on apprendre de cela? N'est-ce pas trop obsolète pour être utile?

61voto

OJ. Points 16939

Cette question est au bord de la religion :) Mais je vais donner à mes pensées, de toute façon.

Je ne vois valeur actuel de l'API Win32. La plupart, si pas tous, les bibliothèques GUI (gérés ou non) suite à des appels à l'API Win32. Même la plus approfondie sur les bibliothèques ne couvrent pas 100% de l'API, et donc il y a toujours des lacunes qui ont besoin d'être branché en direct des appels d'API ou P/invoquant. Certains des noms de la wrappers autour des appels de l'API ont des noms similaires de la sous-jacentes des appels d'API, mais ces noms ne sont pas exactement l'auto-documentation. Donc, la compréhension de l'API sous-jacente, et la terminologie qui y sont utilisés, une aide dans la compréhension de l'enveloppe d'Api et de ce qu'ils font.

De Plus, si vous comprenez la nature des sous-jacents des Api qui sont utilisés par les cadres, alors vous aurez à faire de meilleurs choix en ce qui concerne la bibliothèque de fonctionnalités que vous devez utiliser dans un scénario donné.

Cheers!

22voto

paercebal Points 38526

J'ai gardé standard C/C++ pour des années avant d'apprendre l'API Win32, et pour être tout à fait franc, "l'apprentissage de l'API Win32" la partie n'est pas la meilleure expérience de ma vie.

Dans une main de l'API Win32 est assez cool. C'est comme une extension de la norme API (qui a besoin d' fopen quand vous pouvez avoir CreateFile. Mais je suppose que UNIX/Linux/WhateverOS ont la même gizmo fonctions. De toute façon, Unix/Linux, ils ont "Tout est fichier". Dans Windows, ils ont "Tout est un... la Fenêtre" (sans blague! Voir CreateWindow!).

Dans l'autre main, c'est un héritage de l'API. Vous aurez affaire C brutes, et des matières premières C de la folie.

  • Comme révélatrice de la structure de sa propre taille à passer par l'intermédiaire d'un void * pointeur de certains fonction Win32.
  • La messagerie peut être assez déroutant, trop: le Mélange des objets en C++ avec Win32 de windows conduire à des exemples très intéressants de Poulet ou des Oeufs problème (moments drôles quand vous écrivez une sorte d' delete this ; dans une méthode de classe).
  • Avoir à la sous-classe des WinProc quand vous êtes plus familier avec l'objet de l'héritage est à la tête de fractionnement et le moins qu'optimales.
  • Et bien sûr, il y a la joie de "Pourquoi, dans ce domaine de la fracturation hydraulique monde qu'ils ont fait cette chose de cette façon ??" des moments lorsque vous frappez votre clavier avec votre tête une fois de trop et revenir à la maison avec les touches gravées dans votre front, juste parce que quelqu'un a pensé qu'il serait plus logique d'écrire une API pour activer le changement de la couleur d'une "Fenêtre", non pas en changeant l'une de ses propriétés, mais en l'invitant à sa fenêtre parente.
  • etc.

Dans la dernière main (trois mains ???), considérer que certaines personnes qui travaillent avec les Api sont eux-mêmes en utilisant le code hérité du style. Le moment où vous l'entendez "const est pour les nuls" ou "je ne suis pas d'utiliser des espaces de noms car elles permettent de diminuer la vitesse d'exécution", ou mieux encore "Hey, qui a besoin de C++? Je code dans ma propre marque de orientée objet en C!!!" (Sans blague... Dans un environnement professionnel, et le résultat a été tout un spectacle...), vous allez sentir le genre de peur seulement condamné sentez en face de la guillotine.

Alors... dans l'Ensemble, c'est une intéressante expérience.

Modifier

Après re-lecture de ce post, je vois qu'il pourrait être considéré comme trop négatives. Il n'est pas.

Il est parfois intéressant (ainsi que frustrant) pour savoir comment les choses fonctionnent sous le capot. Vous l'aurez compris, malgré les énormes (impossible?) les contraintes, de l'API Win32 équipe a fait un travail merveilleux pour être sûr de tout, de vous "olde Win16 programme" à la votre "dernier Win64 over-the-top", peuvent travailler ensemble, dans le passé, maintenant et dans l'avenir.

La question est: voulez-vous vraiment?

Parce que passer des semaines à faire des choses qui pourrait être fait (et fait mieux) dans d'autres plus haut niveau et/ou une API orientée objet peut être assez de motivation (expériences de la vie réelle: 3 semaines pour Gagner de l'API, à l'encontre de 4 heures dans les trois autres langues et/ou des bibliothèques).

De toute façon, vous trouverez de Raymond Chen Blog très intéressant en raison de sa vue de l'intérieur sur les deux Gagner de l'API et de son évolution à travers les années:

http://blogs.msdn.com/oldnewthing

16voto

James Devlin Points 6699

Les Api natives sont les "vrais" Api du système d'exploitation. L' .NET-library est (à quelques exceptions près) rien de plus qu'une fantaisie wrapper autour d'eux. Donc oui, je dirais que quelqu'un qui peut comprendre .NET avec toute sa complexité, peut comprendre relativement choses banales comme de parler de l'API sans le bénéfice d'un milieu-homme.

Juste essayer de le faire d'Injection de DLL à partir de code managé. Il ne peut pas être fait. Vous serez forcé d'écrire du code natif pour cela, pour le fenêtrage tweaks, pour de vrai-classement, et une douzaine d'autres choses.

Donc oui: vous doit (doivent) connaître les deux.

Edit: même si vous prévoyez d'utiliser P/Invoke.

16voto

Ed. Points 1012

Absolument. Quand personne ne connaît le bas niveau, qui va mettre à jour et écrire les langages de haut niveau? En outre, lorsque vous comprenez les éléments de bas niveau, vous pouvez écrire du code plus efficace dans un langage de niveau supérieur et déboguer plus efficacement.

11voto

ParanoidMike Points 650

Sur l'hypothèse que vous êtes en train de construire des applications ciblées sur Windows:

  • il peut être instructif pour comprendre les niveaux inférieurs du système, comment ils fonctionnent, comment votre code interagit avec eux (même si ce n'est qu'indirectement), et où vous avez des options supplémentaires qui ne sont pas disponibles dans les abstractions de niveau supérieur
  • il ya des moments où votre code peut ne pas être aussi efficace, de haute performance ou suffisamment précis pour que vos exigences
  • Cependant, dans de plus en plus de cas, des gens comme nous (qui n'ont jamais appris "non géré codage") sera en mesure de sortir de la programmation, nous essayons de le faire sans "apprentissage" Win32.
  • Ensuite, il y a beaucoup de sites qui offrent de travail des échantillons, des fragments de code et même entièrement fonctionnel code source que vous pouvez "effet de levier" (emprunter, plagier mais vérifiez que vous êtes de se conformer à toute re-licence d'utilisation ou des droits d'auteur!) afin de combler les vides qui ne sont pas gérées par la .NET framework bibliothèques de classes (ou les bibliothèques que vous pouvez télécharger ou licence).
  • Si vous pouvez tirer sur les exploits dont vous avez besoin sans déconner dans Win32, et que vous faites un bon travail de développement bien formé, lisible le code managé, je dirais que le mastering .NET serait un meilleur choix que de diffuser vous-même mince sur deux environnements très différents.
  • Si vous avez souvent besoin de tirer parti de ces fonctionnalités de Windows qui n'ont pas reçu un bon Cadre de la bibliothèque de classe de la couverture, puis par tous les moyens, d'acquérir les compétences dont vous avez besoin.
  • J'ai personnellement passé beaucoup trop de temps à se soucier des "autres secteurs" de codage que je suis censé comprendre à produire de "bons programmes", mais il ya beaucoup de masochistes qui pense que tout le monde les besoins et les désirs sont comme leur propre. La misère aime la compagnie. :)

Sur l'hypothèse que vous êtes la création d'applications pour le "Web 2.0" du monde, ou qui serait tout aussi utile/utile pour *NIX & MacOS utilisateurs:

  • Stick avec des langages et compilateurs qui cible autant de croix-plate-forme d'environnements que possible.
  • pure .NET dans Visual Studio est mieux que Win32 évidemment, mais à l'encontre du développement de la MONO bibliothèques, peut-être à l'aide de la Forte de Développer des IDE, est probablement une bien meilleure approche.
  • vous pouvez également passer votre temps à l'apprentissage de Java, et de ces compétences serait de transférer très bien à la programmation en C# (ainsi que le code Java serait théoriquement exécuter sur n'importe quelle plateforme, avec l'appariement JRE). J'ai entendu dire que Java est plus comme "écrire une fois, debug partout", mais c'est probablement aussi vrai (ou même plus que d') C#.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X