Pregunta

Esto es parte de una serie de al menos dos estrechamente relacionadas, pero distintas preguntas. Espero que estoy haciendo lo correcto al pedir por separado.

Estoy tratando de conseguir mi Visual C ++ 2008 aplicación al trabajo sin la biblioteca de tiempo de ejecución C. Es una aplicación Win32 GUI sin MFC u otra materia de lujo, simplemente API de Windows.

Así que me puse Propiedades del proyecto -> Configuración -> C / C ++ -> Avanzado -.> Omitir biblioteca por defecto de nombres en Sí (compilador bandera /Zl) y reconstruido

A continuación, el enlazador se queja de un _WinMainCRTStartup externo sin resolver. Justo lo suficiente, puedo decirle al enlazador a utilizar un punto de entrada diferente, digamos MyStartup. De lo que se reúnen alrededor de la web, _WinMainCRTStartup hace algunas cosas de inicialización, y probablemente Quiero MyStartup hacer un subconjunto de eso.

Así que mi pregunta es:? ¿Qué funciones realizan _WinMainCRTStartup, y cuáles de éstos puedo omitir si no utilizo el CRT

Si usted está bien informado acerca de estas cosas, por favor, eche un vistazo a mi otra pregunta también. Gracias!

Aparte:? ¿Por qué quiero hacer esto en primer lugar

  1. Mi aplicación no utiliza de forma explícita ninguna función CRT.
  2. I como aplicaciones clara y directa.
  3. Se va a enseñarme algo nuevo.
¿Fue útil?

Solución

punto de entrada de la CRT hace lo siguiente (esta lista no es completa):

  • Inicializa estado global que necesita el CRT. Si esto no se hace, no se puede utilizar cualquier función o estado proporcionados por el CRT.
  • Inicializa un estado global que es utilizado por el compilador. controles en tiempo de ejecución, tales como la cookie de seguridad utilizado por / GS sin duda se destaca aquí. Puede llamar __security_init_cookie a sí mismo, sin embargo. Es posible que tenga que añadir otros códigos para otros controles en tiempo de ejecución.
  • Llamadas constructores de objetos C ++. Si está escribiendo código C ++, puede que tenga que emular este.
  • línea de comando recupera la información y la puesta en marcha proporcionada por el sistema operativo y se lo pasa a su principal. Por defecto, no hay parámetros se pasan al punto de entrada del programa por el sistema operativo - todos ellos son provied por el CRT
  • .

El código fuente CRT está disponible con Visual Studio y se puede pasar por el punto de entrada del tubo de rayos catódicos en un depurador y saber exactamente lo que está haciendo.

Otros consejos

true programa Win32 escrito en C (no C ++) no necesita ninguna inicialización en absoluto, por lo que puede comenzar su proyecto con WinMainCRTStartup () en lugar de < strong> WinMain (HINSTANCE, ...) .

También es posible, pero un poco más difícil de escribir programas de la consola como verdaderas aplicaciones Win32; el nombre predeterminado del punto de entrada es _mainCRTStartup () .

Desactivar toda la generación de código extra características como sondas de pila, cheques de matriz etc. depuración es todavía posible.

Inicialización

En ocasiones resulta necesario el primer parámetro HINSTANCE. Para Win32 (excepto Win32s), se fija a (HINSTANCE) 0x400000 .

La nCmdShow parámetro es siempre SW_SHOWDEFAULT .

Si es necesario, recuperar la línea de comandos con GetCommandLine () .

Terminación

Cuando sus desoves programa hilos, por ejemplo, llamando GetOpenFileName () , de regreso de WinMainCRTStartup () rendimiento palabra clave va a colgar su programa - el uso ExitProcess () lugar.

Advertencias

que se ejecutará en problemas considerables cuando:

  • usando marcos de pila (es decir, las variables locales) de más de 4 KBytes (por función)
  • usando flotador-aritmética de punto (por ejemplo Float-> conversión int)
  • utilizando enteros de 64 bits en las máquinas de 32 bits (se multiplican, las operaciones de bits de desplazamiento)
  • usando C ++ nueva , eliminar , y los objetos estáticos con los no-cero-cabo-all-miembros constructores
  • usando funciones de la biblioteca estándar como fopen () , printf () por supuesto

Solución de problemas

Hay un C estándar biblioteca disponible en todos los sistemas Windows (desde Windows 95), la MSVCRT.DLL .

Para usarlo, importar sus puntos de entrada, por ejemplo usando mi msvcrt-light.lib (google para ello). Pero todavía hay algunas advertencias, especialmente cuando se utilizan los compiladores más recientes que MSVC6:

  • marcos de pila son todavía limitados a 4 Kbytes
  • _ftol_sse o _ftol2_sse debe ser encaminado a _ftol
  • _iob_func debe ser encaminada a _iob

Su inicialización se parece funcionar en tiempo de carga. Por lo menos las funciones del archivo se ejecutarán fichero de tus ajustes.

pregunta antiguo, pero las respuestas son incorrectas o enfoque en un problema uno específico.

Hay una serie de características de C y C ++ que simplemente no estarán disponibles en Windows (o la mayoría de los sistemas operativos, para el caso) si los programas de realidad comenzó a las principal / WinMain.

Tome este sencillo ejemplo:

class my_class
{
public:
    my_class() { m_val = 5; }
    int my_func(){ return m_val }
private:
    int m_val;
}

my_class g_class;

int main(int argc, char **argv)
{
     return g_class.my_func();
}

Para que este programa funcione como se esperaba, el constructor de my_class debe llamarse antes de principal. Si el programa se inició exactamente en principal, se requeriría un corte del compilador (nota: GCC hace esto en algunos casos) para insertar una llamada a la función en el mismo comienzo de principal. En cambio, en la mayoría de los sistemas operativos y en la mayoría de los casos, a diferentes construcciones de función g_class y luego llama principal (en Windows, esto es, ya sea mainCRTStartup o WinMainCRTStartup; en la mayoría de otros sistemas operativos que estoy acostumbrado a que es una función llamada _start)

Hay otras cosas C ++ y C siquiera requiere ser realizado antes o después de principal para el trabajo. ¿Cómo están entrada y salida estándar (std :: cin y std :: cout) utilizable en cuanto se efectúe principales? ¿Cómo funciona atexit trabajo?

El estándar C requiere la biblioteca estándar tiene un POSIX-como API señal, que en Windows debe ser "instalado" antes de main ().

En la mayoría de sistemas operativos, no hay montón proporcionado por el sistema; el tiempo de ejecución C implementa su propia pila (tiempo de ejecución C de Microsoft acaba envuelve las funciones Kernel32 montón).

Incluso los argumentos que se pasan a la principal, argc y argv, deben ser obtenido de alguna manera el sistema.

Es posible que desee echar un vistazo a (antiguos) artículos de Matt Pietrick en la implementación de su propio tiempo de ejecución C para obtener información específica sobre cómo esto funciona con Windows + MSVC (nota: MinGW y Cygwin implementan cosas específicas de manera diferente, pero en realidad caer de nuevo a MSVCRT para la mayoría de las cosas): http://msdn.microsoft.com/en-us/library/bb985746.aspx

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