winapi - setup - windows api tutorial
¿Aprender la API win32 vale la pena? (19)
Estaba seguro de que alguien habría hecho esta pregunta específicamente, pero por lo que puedo ver, nadie lo ha hecho (ha habido una pregunta sobre el aprendizaje de win32 pero eso no cubre si vale la pena hacerlo).
Estoy muy interesado en obtener una comprensión más profunda de todos los sistemas que uso (principalmente programo en C #, al menos profesionalmente), así que me pregunté, de manera muy simple: ¿vale la pena aprender a win32, o es excesivo? ¿Estoy perdiendo el tiempo? ¿Vale la pena el conocimiento que obtendré?
Preguntas similares / relacionadas en StackOverflow:
¿Todavía tiene sentido aprender programación WinAPI de bajo nivel?
¿Qué tan relevante es la programación de Win32 para los profesionales modernos?
¿Utiliza mal el .NET framework y Win32 y su máquina mostrará una pantalla azul? De alguna manera lo dudo.
El mayor valor para saber Win32 (o lenguaje ensamblador) es que cuando algo no funciona como se espera y hay que depurarlo. Cuanto más sepa sobre el sistema subyacente, más fácil será la depuración del problema.
.NET se implementa con la API Win32, cualquiera que desee tener un conocimiento más profundo de .NET se beneficiaría enormemente de tener al menos un conocimiento marginal de win32api.
Abogo por aprender los conceptos detrás de la programación de bajo nivel de Windows si todo lo siguiente es verdadero.
- Vas a hacer cualquier programación de Windows.
- Quieres ser el tipo "ir a" cuando sucede lo inexplicable.
- Te encanta aprender
Las capas de abstracción como .NET funcionan para crear y permitir a los desarrolladores hacer cosas increíbles sin tener que saber mucho. Sin embargo, cuando se utiliza .NET de una manera no anticipada por sus autores que revela uno de sus errores sutiles, entonces ese es el momento en que algunos conocimientos API de win32 recorren un largo camino.
¿Alguna vez tendrá que escribir un mensaje de bomba? Lo dudo. ¿Puede ayudar a diagnosticar problemas? ¡Puedes apostar!
Al menos para mí, aprender una API (supongo que "en profundidad" está implícito) que no uso es una pérdida de tiempo. Prefiero dedicar mi limitada cantidad de tiempo y capacidad intelectual para aprender nuevos conceptos o explorar nuevas herramientas que familiarizarme íntimamente con una herramienta existente que no necesito usar ahora. Cuando necesito una herramienta en particular que no tengo o tengo que usar una herramienta con la que no estoy familiarizado, ese es el momento de aprenderlo con cierta profundidad. Antes de eso, podría hacer una investigación suficiente para saber si me será útil o no, pero no mucho más.
Creo que siempre es interesante saber cómo funciona un sistema si tu trabajo depende de él . No me refiero a que debas aprenderlo todo, pero aun así obtener un buen entendimiento, al menos para poder buscar más por ti mismo el día que tengas que hacerlo.
El software no es mágico, bueno ... vale ... para el 99% de los casos :-)
Aquí hay un enlace a un excelente artículo sobre "pensamiento mágico" y "duendes GUID" de Eric Lippert sobre ese tema: No es magia.
Cuando inventaron C para reemplazar el lenguaje ensamblador, la gente probablemente preguntaba: "¿vale la pena aprender el lenguaje ensamblador?" El valor de saber que ambos eran poder caer al ensamblaje para hacer las cosas que eran imposibles de lograr en C (por ejemplo, desencadenar una interrupción).
Lo mismo puede decirse de Win32. Hay algunas cosas que son imposibles de hacer en C #. Si no conocía la API de Win32, descartaría algunas cosas como imposibles. Sin embargo, una vez que sepa lo que se está perdiendo, en esas situaciones raras, podrá "soltar para ganar32" y hacerlas.
Otra forma de verlo es la siguiente: la programación se trata de ser capaz de pensar en múltiples niveles de abstracción al mismo tiempo. Por ejemplo, si sabe que su idioma utiliza cadenas inmutables, no escriba un algoritmo que agregue un solo carácter a uno 10000 veces, porque será lento. Si conoces la API de Win32, podrás pensar cómo se implementa realmente cada línea que escribes en C # y eso te ayudará a escribir un mejor código.
En su carrera, es poco probable que solo esté creando aplicaciones greenfield en las que tendrá la libertad de elegir la tecnología y los lenguajes de programación utilizados.
Tarde o temprano tendrás que integrar con el código anterior escrito en Win32 y C / C ++. En ese caso, el conocimiento de Win32 ayudará, especialmente si está integrando usando PInvoke o C ++ / CLI.
Esta pregunta parece un poco anticuada, pero responderé de todos modos.
Respuesta: Complicado: sí. Simple: probablemente no sea necesario.
Realmente depende de lo que necesitas hacer. Si necesita usar una característica no actual compatible con .NET, have-at-er. Pero ten cuidado, la mayoría de los mimos que Framework proporciona no lo hace Win32, y si haces algo increíblemente estúpido, tu máquina tendrá pantalla azul.
Sé cuándo salió .NET por primera vez, no tenía interés en aprender Win32, .NET estaba aquí y fue una gran mejora. Pero la triste realidad de Windows es la siguiente: todas las funciones nuevas en Windows se implementan primero en código nativo, punto. Si desea utilizar cualquier parte de Windows antes de que .NET la envuelva, está usando Win32 de C ++ o Win32 desde C # o desde VB.NET. .NET es un contenedor para todas las cosas en Win32. Entonces, si no puede esperar, sí, puede interoperar en las entrañas inferiores del sistema operativo si lo desea.
Saber Win32 y probablemente algún día Win64 (como sea que lo llamen) siempre será una habilidad útil. Cualquier tecnología whizzbang requiere apuntalamientos en alguna parte.
La pregunta es muy parecida a: "Vale la pena aprender a ensamblar "; y la respuesta es la misma:
"Sí, porque comprenderá los fundamentos y podrá percibir más profundamente que aquellos que solo trabajan en el nivel superior de la abstracción".
Sin embargo, por la misma razón, probablemente no escribas la API de Win32 directamente el 99.5% de las veces.
Me gustaría agregar más a esto. Nunca estudié formalmente Win32 API / MFC. Comencé a usar Visual C ++ 4 cuando me interesé por primera vez en la programación de GUI. De todos modos, me gustaría mantener esa base entonces, ya que nunca me di cuenta lo suficientemente rápido (era bastante joven, en realidad), así que estudié Visual Basic en su lugar.
Por alguna razón, Delphi nunca me interesó aunque conocía a Pascal lo suficientemente bien, pero estoy divagando. En estos días, trabajo en TI y desarrollo scripts de instalación en NSIS, y de vez en cuando necesito funcionalidades adicionales que NSIS no proporciona, por lo que creo mi propio complemento y para mantenerlo rápido y sin dependencias, opto por Win32 API opuesto a MFC o incluso a C ++ completo.
La razón principal de este comentario es que mi propia curiosidad me enganchó. Me gusta saber más, ¿dónde está el mejor recurso para aprender la API? ¿Un libro? ¿Sitio web?
¿Merece la pena abordar el MFC también? ¡Vi un sitio web sobre un compañero que desarrolla aplicaciones Win32 GUI, en conjunto! Creo que eso es exagerado, sinceramente, pero es un código compacto, rápido, interesante, el concepto, pero nunca pude concretar el ensamblaje 80x86 (¡demonios, incluso el ensamblaje RISC en la universidad nunca pude hacerlo!)
Muchas de las respuestas "No" aquí parecen enfocarse en aprender los métodos, las estructuras y lo que no está disponible en la API. Yo diría que sí, pero no se centre en los componentes individuales de la API, sino en el diseño general y la forma en que funciona. Es mucho más fácil solucionar problemas incluso con el código .NET cuando comprenda lo que sucede en el nivel central del sistema operativo.
No repetiré una y otra vez lo que los demás ya dijeron muchas veces.
Aquí hay un enlace a un tutorial de Win32 con el que actualmente estoy aprendiendo sobre los conceptos básicos de Win32. Me parece bastante interesante y fácil de seguir.
Este tutorial me ayuda a obtener lo que no entendí primero, cuando empecé a programar en mis años de escuela secundaria.
Nunca podrá simplemente "aprender" toda la API de win32, es demasiado para asimilar, y será un objetivo en movimiento. Si desarrollas en C #, no hay un punto real.
Dicho esto, intente crear el Bloc de notas usando C simple y solo llamadas API. Eso le enseñará lo suficiente para que un desarrollador de C # lo aprecie al menos.
Personalmente creo que todavía vale la pena aprender la API de Win32.
Por lo que recuerdo, cuando comencé a aprender Win32 (después de hacer algunos VB (A), Pascal, etc.) aprendí mucho sobre Windows y entendí cómo funciona la cosa en Windows. Todo estaba más claro. :)
Entonces, según su pregunta, aprenderá mucho sobre Windows a través del aprendizaje de Win32. Como dijiste, eres un programador de C # y no estoy seguro si lo usarás a menudo, porque casi todo lo que necesitas ya está allí, en .NET.
Sí, debes aprender los principios básicos de cómo funciona Windows (muchas de estas cosas son anteriores a Win32). ¿Por qué? Por la misma razón que entiendo cómo funciona una junta de mortaja y espiga, aunque no fabrico mis propios muebles, o por qué entiendo cómo funciona un motor de combustión interna aunque no haga el mantenimiento de mi propio automóvil.
Trabajas a un nivel más alto de abstracción, lo cual es bueno, pero cuando esa abstracción se filtra , no es un "si", sino un "cuándo". Si no entiendes lo básico de Windows, estarás perdido. Si no conoce al menos parte de la API, no tendrá una pista sobre dónde buscar si necesita la funcionalidad P / Invoke no disponible en .Net.
Aparte de eso, ¿no es motivo suficiente curiosidad ?
Sí, los principios de la API de Win32 son útiles para aprender: estos principios son la base sobre la cual se construye todo lo demás.
Las API de .NET para el desarrollo de la GUI, tanto Windows.Forms como WPF, hacen lo que hacen dentro de las limitaciones de lo que es posible sobre la API de Win32. Las decisiones clave de arquitectura de estos marcos fueron restringidas e informadas por la API de Win32.
Por otro lado, es menos probable que obtengas un gran valor si te sumerges profundamente en la API, ya que hay mucho que aprender, y dado que pasas la mayor parte del tiempo trabajando en C #, tendrás menos oportunidades de usa el conocimiento directamente
Por cierto, lo mismo se aplica a otras tecnologías también, como redes, criptografía y diseño de hardware. Aprender los fundamentos te ayudará a ser un mejor desarrollador.
Si está intentando escribir una aplicación VB6, la API Win32 le permite hacer muchas cosas que VB6 no admite de forma nativa.
Si está escribiendo una aplicación C # WinForms, le recomendaría que primero aprenda los vastos alcances de .NET Framework.
Editar
Si realmente quiere saber qué está pasando bajo el capó en Windows, entonces tal vez quiera ver una copia de Programming Windows 3.1 de Charles Petzold.
Si tuviera que comenzar hoy, no aprendería toda la API. Sin embargo, creo que los conceptos básicos son importantes para comprender, con una comprensión de cómo funcionan los bucles de mensajes como la principal prioridad.
Tener un conocimiento práctico de cómo funciona Win32 en el nivel más bajo sin duda será invaluable si planea hacer el desarrollo de Windows en el futuro. Le da un nivel de información sobre cosas como Windows, Mensajería y GDI que están ocultas cuando llega al nivel de .NET.
No recomendaría que intentes utilizar Win32 para escribir todas tus aplicaciones, pero creo que cualquier desarrollador de Windows se beneficiaría de escribir una aplicación Win32 simple usando C / C ++.
Esto es menos cierto para cosas como WPF donde hay menos dependencia de Win32, pero el simple hecho de saber cómo funciona Win32 lo ayudará a comprender o apreciar algunas de las decisiones de diseño en WPF.