¿Tiene sentido todavía para aprender de bajo nivel de WinAPI de programación?[cerrado]

StackOverflow https://stackoverflow.com/questions/5507

  •  08-06-2019
  •  | 
  •  

Pregunta

¿Tiene sentido, teniendo todas las de la C#-gestionado-bienaventuranza, para volver a Petzold de Programación de Windows y tratar de producir código w/ puro WinAPI?

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

¿Fue útil?

Solución

Esta pregunta es rayana en lo religioso :) Pero voy a dar mi opinión de todos modos.

Veo valor en learing la API de Win32.La mayoría, si no todos, interfaz gráfica de usuario de las bibliotecas (gestionados o no) resultado en las llamadas a la API de Win32.Incluso la más completa de las bibliotecas de no cubrir el 100% de la API, y por lo tanto siempre hay vacíos que necesitan ser conectado directa de llamadas a la API o P/la invocación.Algunos de los nombres de los contenedores de las llamadas a la API tienen nombres similares a las llamadas a la API, pero esos nombres no son exactamente de auto-documentación.De modo que la comprensión de la API subyacente, y la terminología utilizada en el mismo, le ayuda en la comprensión de la envoltura Api y lo que realmente hacen.

Además, si usted entiende la naturaleza de las APIs que son utilizados por los marcos, entonces usted va a tomar mejores decisiones con respecto a que la funcionalidad de la biblioteca debe utilizar en un determinado escenario.

Saludos!

Otros consejos

Seguí a C/C++ estándar para años antes de que el aprendizaje de la API de Win32, y sencillamente, el "aprendizaje de la API de Win32" no es el técnico mejor experiencia de mi vida.

En una parte de la API de Win32 es bastante fresco.Es como una extensión de la C API estándar (que las necesidades de fopen cuando usted puede tener CreateFile.Pero supongo que en UNIX/Linux/WhateverOS tienen el mismo aparato las funciones.De todos modos, en Unix/Linux, tienen el "Todo es un archivo".En Windows, tienen el "Todo es una...Ventana" (no es broma!Ver CreateWindow!).

En el otro lado, esto es un legado de la API.Usted tendrá que lidiar con el formato raw, C, y raw C locura.

  • Como decirle a la estructura de su propio tamaño para pasar a través de un void * puntero a alguna función de Win32.
  • Mensajería puede ser bastante confuso, y también:La mezcla de objetos de C++ con Win32 de windows conducir a muy interesantes ejemplos de Huevo o la gallina problema (momentos divertidos cuando se escribe una especie de delete this ; en un método de clase).
  • Tener a la subclase de un WinProc cuando estás más familiarizado con la herencia de objetos es el jefe de división y menos que óptima.
  • Y, por supuesto, no es la alegría de la "¿Por qué en este fracking mundo en el que hizo esta cosa de esta manera ??"momentos cuando toca el teclado con la cabeza una vez demasiados, y volver a casa con las llaves en el grabado en su frente, sólo porque alguien consideró que era más lógico escribir una API para permitir el cambio de color de una "Ventana", no por el cambio de una de sus propiedades, pero por preguntar a su ventana principal.
  • etc.

En la última mano (tres manos ???), tenga en cuenta que algunas personas que trabajan con el legado del Api son en sí mismos el uso de código heredado el estilo.El momento en que escuche "const es para dummies"o "Yo no uso de espacios de nombres debido a que disminuyen el tiempo de ejecución de la velocidad"o aún mejor "Hey, que las necesidades de C++?I código en mi propia marca de orientado a objetos C!!!"(No es broma...En un entorno profesional, y el resultado fue todo un espectáculo...), usted se sentirá que el tipo de terror que sólo condenó a sentirse en la parte frontal de la guillotina.

Así que...Con todo, es un interesante experiencia.

Editar

Después de volver a leer este post, veo que podría ser visto como demasiado negativo.No es.

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

La pregunta es:Lo que realmente quieren?

Porque el hecho de pasar semanas para hacer las cosas que podría hacer (y de hecho mejor) en otras más alto nivel y/o API orientada a objetos puede ser muy de-motivacional (experiencia de la vida real:3 semanas para Win API, frente a 4 horas en otros tres idiomas y/o bibliotecas).

De todos modos, usted encontrará Raymond Chen Blog muy interesante por su vista privilegiada sobre Win API y su evolución a través de los años:

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

Absolutamente.Cuando nadie sabe de bajo nivel, que van a actualizar y escribir los lenguajes de alto nivel?También, cuando usted entiende que el bajo nivel de cosas, usted puede escribir código más eficiente en un lenguaje de alto nivel, y también de depuración de manera más eficiente.

La Api nativas son el "verdadero" sistema operativo Api.El .Biblioteca de RED (con pocas excepciones) nada más que un bonito envoltorio alrededor de ellos.Así que sí, yo diría que cualquiera que pueda entender .NET con toda su complejidad, puede comprender relativamente cosas mundanas como hablar con la API, sin el beneficio de un medio-hombre.

Sólo tratar de hacer Inyección DLL de código administrado.No se puede hacer.Usted se verá obligado a escribir código nativo para esto, para ventanas de ajustes, por real subclases, y una docena de otras cosas.

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

Editar:incluso si usted planea usar P/Invoke.

En el supuesto de que usted es la creación de aplicaciones orientadas a Windows:

  • de seguro puede ser de carácter informativo para entender los niveles inferiores del sistema - cómo funcionan, cómo el código interactúa con ellos (aunque sólo sea indirectamente), y donde se tienen opciones adicionales que no están disponibles en las abstracciones de nivel más alto
  • hay veces cuando el código podría no ser tan eficiente, de alto rendimiento o con la precisión suficiente para sus necesidades
  • Sin embargo, en más y más de los casos, la gente como nosotros (que nunca aprendió a "no controlada" código) será capaz de salirse de la programación que estamos tratando de hacer sin el "aprendizaje" de Win32.
  • Además, hay un montón de sitios que ofrecen ejemplos de trabajo, fragmentos de código, e incluso completamente funcional con el código fuente que se puede "aprovechar" (pedir prestado, plagiar - pero comprobar que cumplen con la re-uso de licencia o de derechos de autor!) para llenar los vacíos que no son manejados por el .NET framework bibliotecas de clases (o las bibliotecas que se pueden descargar o licencia).
  • Si usted puede tirar de las hazañas que usted necesita sin complicarse en Win32, y usted está haciendo un buen trabajo de desarrollo, bien formados, legible el código administrado, entonces yo diría que dominar .NETO sería una mejor opción que usted mismo difundir delgada más de dos ambientes muy diferentes.
  • Si con frecuencia se deben aprovechar al máximo las características de Windows que no han recibido un buen Marco de la biblioteca de clases de cobertura, entonces por todos los medios aprender las habilidades que necesita.
  • Personalmente, he pasado demasiado tiempo preocupándose acerca de las "otras áreas" de la codificación de las que estoy supone para entender a producir "buenos programas", pero hay un montón de masoquistas, hay que pensar en todas las necesidades y los deseos son como su propio.La miseria ama la compañía.:)

En el supuesto de que usted está construyendo aplicaciones para la "Web 2.0", el mundo, o que sería igual de útil o beneficioso para *NIX & MacOS los usuarios:

  • Stick con lenguajes de programación y compiladores que destino como muchos entornos multiplataforma como sea posible.
  • puro .NET en Visual Studio es mejor que Win32 obviamente, pero en desarrollo contra el MONO de las bibliotecas, tal vez usando el Sharp Desarrollar IDE, es probablemente un mejor enfoque.
  • también puede pasar su tiempo de aprendizaje de Java, y los conocimientos de transferencia muy bien a la programación de C# (además de que el código Java podría teóricamente ejecutar en cualquier plataforma con la coincidencia de JRE).He oído decir que Java es más como "escribir una vez, depurar todas partes", pero que es probablemente tan cierto como (o incluso más que) de C#.

Analogía:Si usted construir coches para vivir (programación), luego de su muy pertinentes para saber cómo funciona el motor (Win32).

Respuesta Simple, SÍ.

Esta es la respuesta a cualquier pregunta que es como.. "¿tiene sentido para aprender un bajo nivel de idioma/api X, incluso cuando un lenguaje de nivel superior/api Y es la que hay"

Usted es capaz de arrancar tu PC con Windows (o cualquier otro sistema operativo) y hacer esta pregunta en TAN debido a que un par de chicos de Microsoft escribió de 16 bits de la asamblea código que carga el sistema operativo.

El navegador funciona porque alguien escribió un núcleo del sistema operativo en C que sirve a todos los de su navegador solicitudes.

Se va todo el camino hasta lenguajes de secuencias de comandos.

Grande o pequeño, siempre hay un mercado y la oportunidad de escribir algo en cualquier nivel de abstracción.Usted sólo tiene que gustar y ajuste en el derecho del trabajo.

No hay api/idioma en cualquier nivel de abstracción es irrelevent a menos que haya uno mejor que compiten en el mismo nivel.

Otra forma de verlo:Un buen ejemplo de uno de Michael Abrash del libro:Un programador de C fue dado a la tarea de escribir una función para borrar la pantalla.Desde C-mejor (nivel superior) abstracción de la asamblea y de todos, el programador sólo sabía C y lo sabía bien.Él hizo su mejor esfuerzo - se mueve el cursor para cada ubicación en la pantalla y se borra el carácter que hay.Él optimizado el bucle y aseguró que corrió tan rápido como podía.Pero aún era lento...hasta que alguien vino y me dijo que había algunas BIOS/VGA instrucción o algo que pueda borrar la pantalla al instante.

Siempre es útil saber lo que usted está caminando.

Sí, por varias razones:

1) .net envuelve Win32 código..net es generalmente un sistema superior de código de contra, pero tener un poco de conocimiento de Win32 subyacente de la capa (uy, WinAPI ahora que existe el código de 64 bits también) refuerza sus conocimientos 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.Algunos WinAPI experiencia puede proporcionar esto para usted.

3) algunos de los aspectos del sistema no están disponibles a través de la .net framework, sin embargo, y si desea tener acceso a esas características que usted necesita para utilizar p/invoke (ver http://www.pinvoke.net para ayuda allí).Tener al menos un puñado de WinAPI experiencia harán de su p/invoke el desarrollo de un esfuerzo mucho más eficiente.

4) (añadido) Ahora que Win8 ha sido alrededor por un tiempo, es todavía construido en la parte superior de la WinAPI.iOS, Android, mac OS/X, y Linux son todos los que hay, pero la WinAPI todavía va a estar allí por muchos años.

El aprendizaje de un nuevo lenguaje de programación o tecnología es por una de tres razones:
1.Necesidad:estás empezando un proyecto para la construcción de una aplicación web y no sabe nada acerca de ASP.NET
2.Entusiasmo:estás muy emocionado acerca de ASP.NET MVC.¿por qué no probar eso?
3.Tiempo libre:pero que tiene eso de todos modos.

La mejor razón para aprender algo nuevo es Necesario.Si usted necesita para hacer algo que el .NET framework no puede hacer (como el rendimiento, por ejemplo) entonces WinAPI es tu solución.Hasta entonces nos mantenemos a nosotros mismos ocupado con el aprendizaje acerca de .NET

Para la mayoría de las necesidades en el escritorio, no es necesario saber el Win32, sin embargo, hay un MONTÓN de Win32 no .NET, pero es en el outlaying cosas que puede terminar siendo menos del 1% de su solicitud.

Soporte para USB, soporte HID, Windows Media Foundation sólo la parte superior de mi cabeza.Hay muchas fresco Vista de la API disponible sólo a partir de Win32.

Que va a hacer usted mismo un gran favor por aprender a hacer interoperabilidad con una API de Win32, si no de escritorio de programación, porque cuando usted necesita llamar a Win32, y usted, usted no tendrá que pasar semanas rascarse la cabeza.

Personalmente no me gusta mucho la API de Win32, pero no hay valor en el aprendizaje como la API permitirá un mayor control y eficiencia en el uso de la interfaz gráfica de usuario de un lenguaje como Visual Basic, y yo creo que si vas a vivir de la escritura de software que usted debe saber de la API, incluso si no se utiliza directamente.Esto es por razones similares a las razones es bueno aprender C, como el de cómo un strcpy toma más tiempo que la copia de un entero, o por qué usted debe utilizar punteros a arrays como parámetros de la función en lugar de matrices por valor.

El aprendizaje de C o de un nivel inferior idioma sin duda puede ser útil.Sin embargo, no veo ninguna ventaja evidente en el uso de la no administrado WinAPI.

He visto el bajo nivel de la API de Windows de código...no es bastante...Me gustaría que me podría olvidar de ti.Creo que los beneficios de aprender de bajo nivel, como en C, como obtener un mejor entendimiento de la arquitectura de hardware y de cómo todo esto funciona.El aprendizaje de edad de la API de Windows...Creo que las cosas se pueden dejar a la gente en Microsoft que puede necesitar para aprender a construir lenguajes de alto nivel y de la API de...ellos construyeron, que sufren con él ;-)

Sin embargo, si llegas a encontrar una situación en la que usted se siente que usted simplemente no puede hacer lo que usted necesita hacer en un lenguaje de alto nivel (pocos y distantes entre sí), entonces tal vez iniciar el peligroso sumergirse en ese mundo.

sí.echa un vistazo a uTorrent, una increíble pieza de software de la eficiencia.La mitad de su pequeño tamaño es debido al hecho de que muchos de los componentes principales fueron re-escritas para no utilizar gargatuian bibliotecas.

Mucho de esto no podía hacerse sin la comprensión de cómo estas bibliotecas de interfaz con el nivel inferior de la API

Es importante saber lo que está disponible con la API de Windows.Yo no creo que usted necesita para sacar el código, pero usted debe saber cómo funciona.El .NET Framework contiene una gran cantidad de funcionalidad, pero no ofrece sus equivalentes en código administrado por la totalidad de la API de Windows.A veces usted tiene que conseguir un poco más cerca del metal, y sabiendo lo que está allí y cómo se comporta, le dará una mejor comprensión de cómo usarlo.

Este es realmente el mismo que el de la pregunta, debo aprender un bajo nivel de lenguaje como C (o incluso assembler).

La codificación en sin duda es más lento (aunque, por supuesto, el resultado es mucho más rápido), pero su verdadera ventaja es que usted obtiene una visión de lo que está sucediendo en cerca de nivel del sistema, en vez de sólo la comprensión de otra persona metáfora de lo que está pasando.

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

Voy a ponerlo de esta manera.No me gusta la programación de la API de Win32.Puede ser un dolor en comparación con código administrado.PERO, me alegro de saber de ti porque me pueden escribir programas que de otra manera no sería capaz.Puedo escribir los programas que otras personas no pueden.Además de que da una visión más clara de lo que el código administrado está haciendo detrás de las escenas.

La cantidad de valor que salir de aprendizaje de la API de Win32, (aparte de la clase de ideas generales que recibe de aprendizaje acerca de cómo las tuercas y los pernos de la máquina encajan) depende de lo que usted está tratando de lograr.Una gran cantidad de la API de Win32 se ha ajustado muy bien en .NET biblioteca de clases, pero no todo.Si por ejemplo usted está buscando para hacer algo de graves programación de audio, que parte de la API de Win32 sería un excelente objeto de estudio debido a que sólo la más básica de las operaciones están disponibles a partir de .NET clases.Última vez que lo comprobé, incluso el managed DirectX biblioteca de DirectSound fue horrible.


En el riesgo de la vergüenza de la auto-promoción....

Me encontré con una situación en la que la API de Win32 era mi única opción.Quiero tener diferentes descripciones de cada elemento en un cuadro de lista.Escribí como yo lo hice en esta pregunta.

Incluso en muy, muy alto nivel de idiomas que todavía hacen uso de la API.Por qué?Bueno, no todos los aspectos de la API ha sido replicado por las diferentes librerías, frameworks, etc.Usted necesita aprender la API por el tiempo que se necesita la API para lograr lo que usted está tratando de hacer.(Y no más).

Aparte de algunos casos muy especiales cuando usted necesita el acceso directo a las APIs, yo diría que NO.

Hay un considerable tiempo y esfuerzo necesarios para aprender a implementar la API nativa de llamadas correctamente y al regreso de valor es no vale la pena.Prefiero pasar el tiempo de aprendizaje de algunas de las nuevas tecnología caliente o marco que harán su vida más fácil y programación de menos doloroso.No décadas, obsoleto COM bibliotecas que nadie usa ya (lo siento a los usuarios de COM).

Por favor, no de piedra mí para esta vista.Sé que muchos de los ingenieros de aquí realmente curioso almas y no hay nada de malo con el aprendizaje de cómo funcionan las cosas.Curiosidad es buena y ayuda a la comprensión.Pero desde un punto de vista empresarial, prefiero pasar una semana en aprender a desarrollar aplicaciones Android de cómo llamadas OLEs o COMs.

Si usted está planeando desarrollar una cruz la aplicación de la plataforma, Si el uso de win32, a continuación, la aplicación puede ejecutar fácilmente en linux a través de WINE.Esto se traduce en una muy fáciles de mantener la aplicación.Esta es una de las ventajas del aprendizaje de win32.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top