2010-06-24 7 views
7

Miré algunas otras preguntas en SO y no está claro si c está construido encima, debajo o junto al WINAPI. Al igual que, por ejemplo, ¿podría alguien escribir algo en pure c que pudiera abrir una ventana, o necesitarían usar la API de Windows?¿Cuál es la relación entre C y la API de Windows?

Me di cuenta de las similitudes entre la versión c (biblioteca?) De abrir un archivo (fopen) vs la versión de la API de Windows (CreateFile) que me pregunto si uno es simplemente un contenedor para el otro. ¿Alguien sabe?

Si Windows se está ejecutando; es un programador forzado a programar usando la API de Windows para ejecutar algo o puede el programador no usar la API de Windows y acceder directamente al hardware (es decir, ¿el sistema operativo de Windows protege el acceso al hardware)?

Que es más portátil entre las diferentes versiones de windows of windows ce. La documentación que encontré (que ahora ha cambiado) solía decir que CreateFile solo vuelve a la versión 2.0 de Windows ce (aquí: http://msdn.microsoft.com/en-us/library/ms959950.aspx - Observe la nota en el enlace en la parte inferior que muestra que la información de la versión compatible ha sido modificada) . Entonces, ¿qué se supone que uno debe usar para Windows Ce versión 1? En otras palabras, ¿es más probable que la programación con funciones c o las funciones etiquetadas WINAPI funcionen en todas las versiones de Windows CE?

leí lo siguiente en un libro acerca de las ventanas de programación ce y me confundió, por lo que todas las preguntas anteriores se puede entender mejor en el contexto de darle sentido a lo siguiente:

Windows CE es compatible con la mayoría de las mismas funciones de E/S de archivos encontradas en Windows NT y Windows 98. Se admiten las mismas llamadas API de Win32, como CreateFile, ReadFile, WriteFile y CloseFile. Sin embargo, un programador de Windows CE debe conocer algunas diferencias. En primer lugar, las funciones de E/S de archivos C estándar, como fopen, fread y fprintf, no son compatibles con Windows CE. Del mismo modo, los viejos estándares Win16, _lread, _lwrite y _llseek, no son compatibles. Esto no es realmente un gran problema porque todas estas funciones se pueden implementar fácilmente envolviendo las funciones del archivo de Windows CE con una pequeña cantidad de código.

Mi comprensión de la envoltura es que usted tiene que tener algo para envolver, teniendo en cuenta lo que parece que Win16 y biblioteca c no están disponibles se le afirmando para envolver la función CreateFile para hacer su propia versión c-como de fopen ? (La única otra cosa de la que soy consciente es del ensamblaje, y si eso es lo que sugería envolver, no estaría escrito de manera tan informal.)

Dado lo anterior, ¿cuál es la relación de dependencia entre c idioma (sintaxis, estructuras de datos, control de flujo), la biblioteca de funciones c (por ejemplo, fopen) y la API de Windows (por ejemplo, CreateFile)?

+3

Por favor ACTUALIZA la pregunta. Usted es el dueño de esta pregunta. No agregue comentarios En realidad, mejore la pregunta con su definición de portabilidad. –

Respuesta

17

C existía mucho antes que Windows. La API de Windows es un grupo de bibliotecas escritas en C. Es posible o no que sea posible duplicar su funcionalidad usted mismo, dependiendo de lo que Microsoft haya documentado o puesto a disposición a través de la API. En algún nivel, es probable que fopen() y CreateFile() llamen el mismo o un servicio de sistema operativo similar, pero es poco probable que uno sea un envoltorio estricto para el otro. Probablemente sea difícil evitar la API de Windows para acceder al hardware directamente, pero todo es posible dado el tiempo suficiente y el esfuerzo de programación.

+5

E incluso antes de que las pantallas de texto fueran convencionales. Hay una razón por la que printf es printf y no displayf :) – Cogwheel

+10

En realidad, 'fopen' * está * escrito directamente en términos de' CreateFile'. Si sigue su implementación, eventualmente llama a 'CreateFile' en open.c de la fuente CRT (incluida con Visual Studio). –

+4

Mi comentario anterior obviamente se aplica solo a Windows. El punto de usar 'fopen' es que está disponible en cualquier implementación de C y usa lo que sea que el método" nativo "para abrir archivos esté en esa plataforma ... en Windows es' CreateFile', en Linux está 'abierto', etc. ... –

10

C no sabe nada acerca de las GUI, y MUY poco sobre los sistemas operativos en absoluto. Cualquier cosa que hagas en gráficos en C es mediante el uso de bibliotecas, de las cuales la api win32 es un ejemplo.

5

La API de Windows se implementa en el lenguaje de programación C.La funcionalidad proporcionada por las bibliotecas estándar de C, como fopen, es portátil porque se compila en el código de ensamblaje apropiado para diferentes arquitecturas por diferentes compiladores. Las funciones de la API de Windows, como CreateFile, solo funcionan en máquinas con Windows y, por lo tanto, no son portátiles.

1

La mayoría de los sistemas operativos, incluidos Windows, están escritos en C (y o en ensamblador). La Biblioteca luego se modifica para que cada sistema operativo haga las cosas básicas. (Sockets, archivos, memoria, etc.).

WINAPI es solo un conjunto de bibliotecas (escritas en C y/o Ensamblador) que permiten el acceso a la funcionalidad dentro del sistema operativo.

No está relacionado con Windows, después de haber cambiado su pregunta, creo que lo que está tratando de entender es el arranque de un sistema operativo (Windows u otro).
The book Operating Systems Design and implementation discute la implementación de Minix (En qué Linux se basa).

4

En teoría, es posible escribir C que habla directamente con el hardware. En los días de MS-DOS (por ejemplo), muchos de nosotros lo hacíamos regularmente (ya que MS-DOS simplemente no proporcionaba lo que necesitábamos). Editar: en algunos sistemas integrados pequeños, todavía es bastante común, pero en los sistemas de escritorio típicos y tal, esto ha desaparecido casi por completo.

Dos cosas han cambiado. Primero, los sistemas modernos como Linux y Windows son mucho más más completos, por lo que hay mucha menos necesidad de tratar directamente con el hardware. En segundo lugar, la mayoría de los sistemas ahora se ejecutan en modo protegido, por lo que el código de usuario normal no puede hablar directamente al - tiene que pasar por algún tipo de controlador de dispositivo.

Sí, la mayor parte de la biblioteca de C utiliza el sistema operativo subyacente para (por ejemplo) en Windows, fopenfwrite y finalmente llamar CreateFile y WriteFile, pero en Linux que finalmente va a llamar open y write lugar.

2

me di cuenta de las similitudes entre la c (biblioteca?) Versión de la apertura de un archivo (fopen) frente a la versión de Windows API (CreateFile)

No es de extrañar. Ellos hacen cosas similares.

[es] uno es solo un envoltorio para el otro? ¿Alguien sabe?

No puede encontrarlo porque el código fuente es propiedad y se mantiene como secreto comercial. No importa cuál sea más "fundamental". Utiliza la API de Windows desde un programa de Windows. Usas C API de los programas C.

Tenga en cuenta que no importa. Puede usar API C o API de Windows entremezcladas.

Si Windows está en ejecución; ¿alguien se ve obligado a usar la API de Windows para ejecutar algo o pueden omitir ventanas por completo y acceder directamente al hardware?

"Acceder directamente al hardware"? Qué significa eso? Si Windows se está ejecutando, entonces ... bueno ... Windows se está ejecutando. Windows media su acceso al hardware.

Utilice bootcamp o GRUB o algún otro gestor de arranque para evitar Windows y tener "acceso directo al hardware".

Si pueden, ¿es posible dañar el hardware si no sabes lo que estás haciendo?

¿Qué significa esto? ¿Estás preguntando si puedes "dañar" algunos medios rotativos (es decir, discos) haciendo un mal uso de sus controladores? Puede dañar su disco duro sin importar el sistema operativo que esté ejecutando o no ejecutando. Una cuenta privilegiada y un software tonto pueden escribir datos incorrectos en un disco. ¿Eso cuenta como "daño"?

¿Qué es más portátil?

¿Qué significa eso? ¿A otra computadora con Windows? ¿A una computadora que no ejecuta Windows? ¿Por qué preguntas? Por favor, aclare su pregunta para definir lo que quiere decir con "portátil".

entre las diferentes versiones de Windows

Desde diferentes de Windows son incompatibles entre sí, por lo general aconseja utilizar las bibliotecas estándar POSIX y evitar toda la API de Windows de.

Sin embargo, algunas variantes de Windows (por ejemplo, Windows Mobile para el teléfono frente a Windows "Servidor") son esencialmente totalmente incompatibles. Hay muy pocas razones para que un software se ejecute en ambos sistemas operativos. La portabilidad no importa mucho. ¿Por qué intentar ejecutar una aplicación de teléfono en un servidor?


Editar

así que hay el lenguaje C en la parte inferior (la más cercana al hardware), entonces la API de Windows siguiente, entonces la biblioteca de C en la parte superior de la API de Windows?

Esto no tiene sentido. Estás mezclando dos cosas no relacionadas. El "lenguaje" y las "bibliotecas" tienen poco que ver entre sí.

Además, la API no es el sistema operativo. Entonces, al usar la "API" de Windows todo el tiempo, estás haciendo que esto sea más confuso de lo necesario.

Aquí hay una manera de ver esto.

  • El sistema operativo Windows tiene varias API. Hay bibliotecas de funciones subyacentes que no forman parte de la interfaz de la aplicación . Ellos son "internos".
  • Tiene una API nativa de Windows. Se puede llamar desde C.
  • Tiene una API POSIX. Se puede llamar desde C. En algunos casos, la API de Posix generalmente usa la API de Windows.
+0

Después de leer su respuesta, parece que mi definición de portátil podría estar apagada. Vea el comentario en la parte superior sobre la portabilidad. – xaler7

+0

Gracias por decirme que edite la pregunta directamente. – xaler7

+2

No creo que el código fuente de estos sea un secreto comercial. Microsoft envía fopen.c con Visual Studio. – Ken

0

sistemas operativos como Windows contienen bibliotecas API de Windows que permiten acceder a algunas funciones del sistema operativo y, a veces entran en contacto con el hardware, estas bibliotecas están escritas en C

0

Carl Norum señaló que C existía mucho antes de que Windows, pero no olvide que la API de Windows comenzó con la API de MS-DOS, que comenzó con la API de CP/M. C solo existió un tiempo corto antes de CP/M.

Muchas de las respuestas parecen implicar que la API de Windows se basa en C, pero eso parece dudoso también. __stdcall es un sinónimo de PASCAL, que era una palabra clave en los compiladores de C de Microsoft porque la API de Windows se basaba en Pascal. __cdecl es el valor predeterminado para las llamadas a funciones en los programas C y C++ compilados por Visual Studio, pero no funciona en llamadas a API.

La relación entre C y la API de Windows es que son capaces de trabajar entre ellos.

+0

re Pascal: no es cierto, lea esta publicación de Raymond Chen: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/02/47184.aspx#47343 – Amro

+0

Amro dijo "re Pascal: no es cierto , lea esta publicación de Raymond Chen: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/02/47184.aspx#47343 ". En esa publicación, leí "Casi todas las funciones de Win16 se exportan como convención de llamadas de Pascal". Esa publicación no habla de Win32. –

+0

Ese artículo dio una explicación de por qué la API de Win16 inicialmente usaba pascal [convención de llamadas] (https://en.wikipedia.org/wiki/X86_calling_conventions) (actualmente Win32 usa la convención stdcall, una variación de la primera). Point no es ni Win16 ni Win32 escritos en Pascal, es una mezcla de ensamblador y C ... Incluso hay indicios de que las versiones futuras del tiempo de ejecución C se escribirán internamente en C++: http: //blogs.msdn.com/b/vcblog/archive/2014/06/10/the-great-crt-refactoring.aspx – Amro

1

WINAPI proporciona una interfaz que los desarrolladores en C pueden usar para utilizar la funcionalidad WINAPI. Los programas C++ también pueden usarlo.

0

Como nota divertida, realmente puede obtener un control sobre la 'potencia' de la API de Windows echando un vistazo a AutoIt http://www.autoitscript.com/autoit3/. AutoIt es un excelente lenguaje de scripting que puede crear GUI, ejecutar aplicaciones de línea de comando, manipular ventanas y procesos, etc. Sí, lo hace con E/S de archivos y redes.

Cuestiones relacionadas