¿Todavía tiene sentido aprender programación WinAPI de bajo nivel? [cerrado]


¿Tiene sentido, teniendo todo el C#-managed-bliss, volver a las Ventanas de programación de Petzold y tratar de producir código con pura WinAPI?

¿Qué se puede aprender de él? ¿No es demasiado anticuado para ser útil?

Author: Jonik, 2008-08-08

22 answers

Esta pregunta roza lo religioso :) Pero daré mis pensamientos de todos modos.

Veo valor en aprender la API de Win32. La mayoría, si no todas, las bibliotecas GUI (administradas o no administradas) dan lugar a llamadas a la API de Win32. Incluso las bibliotecas más completas no cubren el 100% de la API, y por lo tanto siempre hay vacíos que deben ser tapados por llamadas API directas o invocación P/. Algunos de los nombres de los envoltorios alrededor de las llamadas API tienen nombres similares a las llamadas API subyacentes, pero esos nombres no son exactamente auto-documentación. Por lo tanto, comprender la API subyacente y la terminología utilizada en ella ayudará a comprender las API de envoltura y lo que realmente hacen.

Además, si comprende la naturaleza de las API subyacentes que utilizan los frameworks, entonces tomará mejores decisiones con respecto a qué funcionalidad de biblioteca debe usar en un escenario determinado.

¡Salud!
 59
Author: OJ.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 01:00:49

Me mantuve en C/C++ estándar durante años antes de aprender la API de Win32, y para ser franco, la parte de "aprendizaje de la API de Win32" no es la mejor experiencia técnica de mi vida.

En una mano Win32 API es bastante genial. Es como una extensión de la API estándar de C (que necesita fopen cuando se puede tener CreateFile. Pero supongo que UNIX / Linux / WhateverOS tienen las mismas funciones de artilugio. De todos modos, en Unix/Linux, tienen el "Todo es un archivo". En Windows, tienen el " Todo es un... Window " (no bromeo! Ver CreateWindow!).

Por otro lado, esta es una API heredada. Tendrás que lidiar con raw C, y raw C madness.

  • Como decirle a la estructura de uno su propio tamaño para pasar a través de un puntero void * a alguna función Win32.
  • La mensajería también puede ser bastante confusa: Mezclar objetos C++ con windows Win32 conduce a ejemplos muy interesantes de problema de Pollo o Huevo (momentos divertidos cuando escribes una especie de delete this ; en un método de clase).
  • Tener que subclase a WinProc cuando está más familiarizado con la herencia de objetos es la división de la cabeza y menos que óptima.
  • Y por supuesto, existe la alegría de " ¿Por qué en este mundo de fracking hicieron esto de esta manera ?? " momentos en los que golpeas tu teclado con la cabeza una vez más y vuelves a casa con las teclas grabadas en tu frente, solo porque alguien pensó que era más lógico escribir una API para permitir el cambio del color de una "Ventana", no cambiando una de sus propiedades, sino pidiéndolo a su ventana padre.
  • etc.

En la última mano (tres manos ???), considere que algunas personas que trabajan con API heredadas están usando estilos de código heredados. En el momento que escuches "const es para dummies" o "No uso espacios de nombres porque disminuyen la velocidad de ejecución", o aún mejor "Hey, ¿quién necesita C++? ¡Codifico en mi propia marca de C orientada a objetos!!! " (No bromees... En un entorno profesional, y el el resultado fue todo un espectáculo...), sentirás el tipo de temor que solo se siente condenado frente a la guillotina .

So... Con todo, es una interesante experiencia.

Editar

Después de releer este post, veo que podría ser visto como excesivamente negativo. No lo es.

A veces es interesante (así como frustrante) saber cómo funcionan las cosas bajo el capó. Usted entenderá que, a pesar de enorme (imposible?) restricciones, el equipo de API Win32 hizo un trabajo maravilloso para asegurarse de que todo, desde su "programa Win16 olde" hasta su "última aplicación Win64 over-the-top", puede trabajar juntos, en el pasado, ahora y en el futuro.

La pregunta es: ¿realmente quieres?

Porque pasar semanas para hacer cosas que podrían hacerse (y hacerse mejor) en otras API más de alto nivel y/o orientadas a objetos puede ser bastante desmotivador (experiencia de la vida real: 3 semanas para Win API, contra 4 horas en otros tres idiomas y/o biblioteca).

De todos modos, encontrarás el blog de Raymond Chen muy interesante debido a su opinión privilegiada sobre Win API y su evolución a través de los años:

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

 21
Author: paercebal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-15 17:23:46

Las API nativas son las API "reales" del sistema operativo. La biblioteca. NET es (con pocas excepciones) nada más que un envoltorio elegante alrededor de ellos. Así que sí, yo diría que cualquiera que pueda entender. NET con toda su complejidad, puede entender cosas relativamente mundanas como hablar con la API sin el beneficio de un intermediario.

Simplemente intente hacer la inyección DLL desde el código administrado. No se puede hacer. Usted se verá obligado a escribir código nativo para esto, para ajustes de ventana, de verdad subclasificación, y una docena de otras cosas.

Así que sí: usted debe (debe) saber ambos.

Editar: incluso si planea usar P/Invoke.

 16
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 00:57:03

Absolutamente. Cuando nadie conoce el nivel bajo, ¿quién actualizará y escribirá los idiomas de alto nivel? Además, cuando entiendes las cosas de bajo nivel, puedes escribir código más eficiente en un lenguaje de alto nivel, y también depurar de manera más eficiente.

 15
Author: Ed.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 00:31:04

En el supuesto de que está creando aplicaciones dirigidas a Windows:

  • seguramente puede ser informativo comprender los niveles más bajos del sistema: cómo funcionan, cómo interactúa su código con ellos (aunque solo sea indirectamente) y dónde tiene opciones adicionales que no están disponibles en las abstracciones de nivel superior
  • hay momentos en que su código puede no ser tan eficiente, de alto rendimiento o lo suficientemente preciso para sus requisitos
  • Sin embargo, en cada vez más casos, la gente como nosotros (que nunca aprendió "codificación no administrada") será capaz de llevar a cabo la programación que estamos tratando de hacer sin "aprender" Win32.
  • Además, hay un montón de sitios que proporcionan muestras de trabajo, fragmentos de código e incluso código fuente completamente funcional que puede "aprovechar" (pedir prestado, plagiar, pero compruebe que está cumpliendo con cualquier licencia de reutilización o derechos de autor!) para llenar cualquier vacío que no sean manejados por las bibliotecas de clases de. NET framework (o las bibliotecas que puede descarga o licencia).
  • Si puede lograr las hazañas que necesita sin perder el tiempo en Win32, y está haciendo un buen trabajo desarrollando código administrado legible y bien formado, entonces diría que dominar.NET sería una mejor opción que expandirse en dos entornos muy diferentes.
  • Si con frecuencia necesita aprovechar esas características de Windows que no han recibido una buena cobertura de la biblioteca de clases del marco, entonces, por todos los medios, aprenda las habilidades que necesita.
  • He personalmente pasé demasiado tiempo preocupándome por las " otras áreas "de la codificación que estoy supuesto para entender para producir" buenos programas", pero hay un montón de masoquistas por ahí que piensan que las necesidades y deseos de todos son como los suyos. La miseria ama la compañía. :)

En el supuesto de que está creando aplicaciones para el mundo "Web 2.0", o que sería igual de útil/beneficioso para los usuarios de *NIX y macOS:

  • Se adhieren a los lenguajes y compiladores que apuntan como muchos entornos multiplataforma como sea posible.
  • pure.NET en Visual Studio es mejor que Win32 obviamente, pero desarrollar contra las bibliotecas MONO, tal vez usando el IDE de desarrollo Sharp, es probablemente un enfoque aún mejor.
  • también podría pasar su tiempo aprendiendo Java, y esas habilidades se transferirían muy bien a la programación en C# (además, el código Java se ejecutaría teóricamente en cualquier plataforma con el JRE correspondiente). He oído decir que Java es más como " escribir una vez, depurar en todas partes", pero eso es probablemente tan cierto como (o incluso más que) C#.
 11
Author: ParanoidMike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-09 20:27:00

Analogía: Si construyes coches para vivir (programación), entonces es muy pertinente saber cómo funciona el motor (Win32).

 9
Author: Joel Lucsy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 01:01:44

Respuesta simple, SÍ.

 8
Author: Stephen Cox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 01:16:26

Esta es la respuesta a cualquier pregunta que sea similar.. "¿tiene sentido aprender un lenguaje/api X de bajo nivel incluso cuando existe un lenguaje / api Y de alto nivel? "

Usted es capaz de arrancar su PC con Windows (o cualquier otro sistema operativo) y hacer esta pregunta en TAN porque un par de chicos en Microsoft escribió código ensamblador de 16 bits que carga su sistema operativo.

Su navegador funciona porque alguien escribió un kernel del sistema operativo en C que sirve a todos los de su navegador peticiones.

Va hasta los lenguajes de scripting.

Grande o pequeño, siempre hay un mercado y la oportunidad de escribir algo en cualquier nivel de abstracción. Solo tienes que gustarte y encajar en el trabajo correcto.

Ninguna api/lenguaje en ningún nivel de abstracción es irrelevante a menos que haya uno mejor compitiendo en el mismo nivel.

Otra forma de verlo: Un buen ejemplo de uno de los libros de Michael Abrash: A un programador C se le dio la tarea de escribir una función para borrar la pantalla. Dado que C era una abstracción mejor (de mayor nivel) sobre el ensamblaje y todo, el programador solo conocía C y lo conocía bien. Hizo todo lo posible: movió el cursor a cada lugar de la pantalla y borró el personaje allí. Optimizó el bucle y se aseguró de que corriera lo más rápido posible. Pero aún así fue lento... hasta que un tipo entró y dijo que había alguna instrucción de BIOS / VGA o algo que podía limpiar la pantalla al instante.

Siempre ayuda a sepa sobre lo que está caminando.

 7
Author: Senthil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-29 03:24:48

Sí, por algunas razones:

1). net envuelve el código Win32. . net suele ser un sistema superior para codificar, pero tener algún conocimiento de la capa Win32 subyacente (vaya, WinAPI ahora que también hay código de 64 bits) refuerza su conocimiento de lo que realmente está sucediendo.

2) en esta economía, es mejor tener algunas ventajas sobre el otro chico cuando usted está buscando un trabajo. Algunas experiencias de WinAPI pueden proporcionarle esto.

3) algunos aspectos del sistema no son disponible a través de. net framework todavía, y si desea acceder a esas características, necesitará usar p / invoke (consulte http://www.pinvoke.net para algo de ayuda allí). Tener al menos una pizca de experiencia WinAPI hará que su esfuerzo de desarrollo de p/invoke sea mucho más eficiente.

4) (añadido) Ahora que Win8 ha existido por un tiempo, es todavía construido sobre el WinAPI. iOS, Android, OS / X, y Linux están todos por ahí, pero el WinAPI todavía estará por ahí por muchos muchos años.

 7
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-08 00:03:23

Aprender un nuevo lenguaje de programación o tecnología es por una de tres razones:
1. Necesidad: estás empezando un proyecto para construir una aplicación web y no sabes nada sobre ASP.NET
2. Entusiasmo: estás muy entusiasmado con ASP.NET MVC. ¿por qué no lo intentas?
3. Tiempo libre: pero quién tiene eso de todos modos.

La mejor razón para aprender algo nuevo es la Necesidad. Si necesita hacer algo que. NET framework no puede hacer (como el rendimiento, por ejemplo), entonces WinAPI es su solución. Hasta entonces nos mantenemos ocupados aprendiendo sobre. NET

 4
Author: Amr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 01:56:33

Para la mayoría de las necesidades en el escritorio que no necesita saber el Win32, sin embargo, hay una GRAN CANTIDAD de Win32 no en.NET, pero es en el material de desembolso que puede terminar siendo menos del 1% de su aplicación.

Soporte USB, soporte HID, Windows Media Foundation justo en la parte superior de mi cabeza. Hay muchas API de VISTA geniales que solo están disponibles en Win32.

Te harás un gran favor al aprender a hacer interop con una API Win32, si haces programación de escritorio, porque cuando lo haces necesitas llamar a Win32, y lo harás, no pasarás semanas rascándote la cabeza.

 4
Author: Brian Leahy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 16:53:50

Personalmente no me gusta mucho la API de Win32, pero hay valor en aprenderla, ya que la API permitirá más control y eficiencia utilizando la interfaz gráfica de usuario que un lenguaje como Visual Basic, y creo que si vas a ganarte la vida escribiendo software deberías conocer la API incluso si no la usas directamente. Esto es por razones similares a las razones por las que es bueno aprender C, como cómo un strcpy toma más tiempo que copiar un entero, o por qué debe usar punteros a matrices como función parámetros en lugar de matrices por valor.

 4
Author: jeffythedragonslayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-21 13:07:30

Aprender C o un idioma de nivel inferior definitivamente puede ser útil. Sin embargo, no veo ninguna ventaja obvia en el uso del WinAPI no administrado.

 3
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 00:35:21

He visto código API de Windows de bajo nivel... no es bonito... Ojalá pudiera desaprenderlo. Creo que es beneficioso aprender bajo nivel como en C, ya que se obtiene una mejor comprensión de la arquitectura de hardware y cómo funciona todo eso. Aprendiendo la antigua API de Windows... Creo que las cosas se pueden dejar a las personas en Microsoft que pueden necesitar aprenderlo para construir lenguajes de nivel superior y API... la construyeron, que sufran con ella; -)

Sin embargo, si encuentra una situación en la que siente que simplemente no puedes hacer lo que necesitas hacer en un idioma de nivel superior (pocos y distantes entre sí), entonces tal vez comience la peligrosa inmersión en ese mundo.

 3
Author: Mike Stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 00:40:05

Sí. echa un vistazo a uTorrent, una increíble pieza de eficiencia de software. La mitad de su pequeño tamaño se debe al hecho de que gran parte de sus componentes principales se reescribieron para no usar bibliotecas gargatuianas.

Mucho de esto no podría hacerse sin entender cómo estas bibliotecas interactúan con las API de nivel inferior

 3
Author: Ape-inago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 03:53:11

Es importante saber qué está disponible con la API de Windows. No creo que necesites sacar código con él, pero deberías saber cómo funciona. . NET Framework contiene mucha funcionalidad, pero no proporciona equivalentes de código administrado para toda la API de Windows. A veces tienes que acercarte un poco más al metal, y saber qué hay ahí abajo y cómo se comporta te dará una mejor comprensión de cómo usarlo.

 2
Author: Chris Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 02:21:47

Esto es realmente lo mismo que la pregunta, debería aprender un lenguaje de bajo nivel como C (o incluso ensamblador).

La codificación en él es ciertamente más lenta (aunque, por supuesto, el resultado es mucho más rápido), pero su verdadera ventaja es que obtiene una idea de lo que está sucediendo cerca del nivel del sistema, en lugar de simplemente comprender la metáfora de otra persona para lo que está sucediendo.

También puede ser mejor cuando las cosas no funcionan bien, o lo suficientemente rápido o con el tipo de granularidad que lo necesitas. (Y hacer al menos algunas subclases y superclases.)

 2
Author: David L Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-12 06:20:26

Lo pondré de esta manera. No me gusta programar con la API de Win32. Puede ser un dolor en comparación con el código administrado. PERO, me alegro de saberlo porque puedo escribir programas que de otra manera no sería capaz de. Puedo escribir programas que otras personas no pueden. Además, te da más información sobre lo que tu código administrado está haciendo detrás de escena.

 2
Author: Slapout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-26 02:01:45

La cantidad de valor que obtienes al aprender la API de Win32 (aparte del tipo de información general que obtienes al aprender sobre cómo encajan las tuercas y pernos de la máquina) depende de lo que estás tratando de lograr. Una gran parte de la API de Win32 se ha envuelto muy bien en las clases de biblioteca. NET, pero no todo. Si, por ejemplo, está buscando hacer una programación de audio seria, esa parte de la API Win32 sería un excelente tema de estudio porque solo el más básico de las operaciones están disponibles en las clases.NET. La última vez que revisé, incluso la biblioteca DirectSound de DirectX administrada era horrible.


A riesgo de una desvergonzada autopromoción....

Acabo de encontrarme con una situación en la que la API de Win32 era mi única opción. Quiero tener diferentes consejos sobre cada elemento en un listbox. Escribí cómo lo hice en esta pregunta .

 2
Author: Michael Lang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:51

Incluso en idiomas de muy muy alto nivel todavía haces uso de la API. ¿Por qué? Bueno, no todos los aspectos de la API han sido replicados por las diversas bibliotecas, marcos, etc. Necesita aprender la API durante el tiempo que necesite la API para lograr lo que está tratando de hacer. (Y ya no.)

 2
Author: Oorang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-28 18:49:44

Aparte de algunos casos muy especiales cuando se necesita acceso directo a las API, yo diría que NO.

Se requiere un tiempo y un esfuerzo considerables para aprender a implementar correctamente las llamadas a la API nativa y el valor devuelto simplemente no vale la pena. Prefiero pasar el tiempo aprendiendo alguna nueva tecnología caliente o marco que hará su vida más fácil y la programación menos dolorosa. No hace décadas que las bibliotecas COM obsoletas que nadie realmente utiliza más (lo siento para COM usuario).

Por favor, no me apedreen por esta vista. Sé que muchos ingenieros aquí tienen almas muy curiosas y no hay nada de malo en aprender cómo funcionan las cosas. La curiosidad es buena y realmente ayuda a la comprensión. Pero desde un punto de vista gerencial, prefiero pasar una semana aprendiendo cómo desarrollar aplicaciones Android que cómo llamar a OLEs o COMs.

 2
Author: Jakub Zaverka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-23 16:39:30

Si planea desarrollar una aplicación multiplataforma, si usa win32, entonces su aplicación podría ejecutarse fácilmente en linux a través de WINE. Esto resulta en una aplicación altamente mantenible. Esta es una de las ventajas de aprender win32.

 1
Author: Manohar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-28 18:59:47