Domanda

Questo fa parte di una serie di almeno due domande strettamente correlati, ma distinti. Spero che sto facendo la cosa giusta, chiedendo loro separatamente.

Sto cercando di ottenere il mio Visual C ++ 2008 app di lavorare senza la libreria di runtime C. Si tratta di un'applicazione Win32 GUI senza MFC o altre cose di fantasia, semplicemente API di Windows.

Così mi sono messo Progetto Proprietà -> Configurazione -> C / C ++ -> Avanzate -.> Omettere predefinito Biblioteca nomi su Sì (compilatore bandiera /Zl) e ricostruito

Poi il linker lamenta un _WinMainCRTStartup esterno non risolto. Va bene, posso dire al linker di utilizzare un diverso punto di ingresso, diciamo MyStartup. Da quanto ho capito tutto il web, _WinMainCRTStartup fa alcune cose di inizializzazione, e probabilmente io voglio MyStartup fare un sottoinsieme di questo.

Quindi la mia domanda è: Quali sono le funzioni _WinMainCRTStartup eseguire, e quale di questi posso omettere se non uso il CRT

Se non si conoscono bene questa roba, si prega di dare un'occhiata a la mia altra domanda troppo. Grazie!

A parte: Perché voglio fare questo in primo luogo

?
  1. La mia app non usa esplicitamente alcuna funzione CRT.
  2. Mi piace apps magro e avaro.
  3. Sarà insegnami qualcosa di nuovo.
È stato utile?

Soluzione

punto di ingresso del tubo catodico fa il seguente (l'elenco non è completo):

  • Inizializza stato globale necessaria per la CRT. Se questo non viene fatto, non è possibile utilizzare qualsiasi funzione o stato fornite dalla CRT.
  • Inizializza uno stato globale utilizzato dal compilatore. controlli in fase di esecuzione, come il cookie di sicurezza utilizzato da / GS sicuramente spicca qui. È possibile chiamare __security_init_cookie da soli, però. Potrebbe essere necessario aggiungere altro codice per altri controlli in fase di esecuzione.
  • Chiamate costruttori sugli oggetti C ++. Se si sta scrivendo codice C ++, potrebbe essere necessario per emulare questo.
  • Recupera riga di comando e avviare le informazioni fornite dal sistema operativo e lo passa il vostro principale. Per impostazione predefinita, nessun parametro vengono passati al punto di ingresso del programma da parte del sistema operativo - sono tutti provied dal CRT
  • .

Il codice sorgente CRT è disponibile con Visual Studio e si può fare un passo attraverso il punto di ingresso del tubo catodico in un debugger e scoprire esattamente quello che sta facendo.

Altri suggerimenti

A true programma Win32 scritto in C (non C ++) non ha bisogno di alcuna inizializzazione a tutti, in modo da poter avviare il progetto con WinMainCRTStartup () al posto di < strong> WinMain (HINSTANCE, ...) .

E 'anche possibile, ma un po' più difficile da scrivere programmi console come applicazioni Win32 veri; il nome predefinito del punto di ingresso è _mainCRTStartup () .

Disattiva tutte le funzioni di generazione di codice extra, come le sonde di stack, i controlli di array ecc debugging è ancora possibile.

L'inizializzazione

A volte è necessario il primo HINSTANCE parametro. Per Win32 (tranne Win32s), è fissato per (HINSTANCE) 0x400000 .

Il nCmdShow parametro è sempre SW_SHOWDEFAULT .

Se necessario, recuperare la riga di comando con GetCommandLine () .

Risoluzione

Quando il programma genera discussioni, ad esempio, chiamando GetOpenFileName () , di ritorno da WinMainCRTStartup () con ritorno parola chiave si bloccherà il vostro programma - utilizzare ExitProcess () invece.

Avvertimenti

verrà eseguito in notevole difficoltà quando:

  • utilizzando stack frame (cioè variabili locali) maggiore di 4 KBytes (per funzione)
  • usando float-aritmetica (ad esempio flottante> conversione int)
  • utilizzando interi a 64 bit su macchine a 32 bit (moltiplicare, operazioni bit-shift)
  • utilizzando C ++ nuovo , Elimina , e gli oggetti statici con non-zero-out-all-soci costruttori
  • utilizzando le funzioni di libreria standard come fopen () , printf () , naturalmente

Risoluzione dei problemi

C'è una libreria C standard disponibile su tutti i sistemi Windows (a partire da Windows 95), il MSVCRT.DLL .

Per usarlo, importare i loro punti di ingresso, ad esempio usando il mio msvcrt-light.lib (google per esso). Ma ci sono ancora alcuni avvertimenti, soprattutto quando si utilizzano i compilatori più recenti di MSVC6:

  • stack frame sono ancora limitati a 4 Kbyte
  • _ftol_sse o _ftol2_sse deve essere indirizzati a _ftol
  • _iob_func deve essere indirizzati a _iob

La sua inizializzazione sembra funzionare al momento del caricamento. Almeno le funzioni di file verrà eseguito seemlessly.

vecchia questione, ma le risposte sono errate o concentrarsi su un problema specifico.

Ci sono una serie di funzioni C e C ++ che semplicemente non saranno disponibili su Windows (o la maggior parte dei sistemi operativi, è per questo), se i programmi effettivamente iniziato a principale / WinMain.

Prendete questo semplice esempio:

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();
}

in modo che questo programma di funzionare come previsto, il costruttore di my_class deve essere chiamato prima principale. Se il programma ha iniziato esattamente alle principale, sarebbe necessario un hack compilatore (nota: GCC fa questo in alcuni casi) per inserire una chiamata di funzione, proprio all'inizio della principale. Invece, sulla maggior parte dei sistemi operativi e nella maggior parte dei casi, una funzione diversa costruisce g_class e quindi chiama principale (su Windows, questo è o mainCRTStartup o WinMainCRTStartup; sulla maggior parte dei altri sistemi operativi sono abituato ad essa è una funzione chiamata _start)

Ci sono altre cose C ++ e persino C richiede di essere fatto prima o dopo principale al lavoro. Come vengono stdin e stdout (std :: cin e std :: cout) utilizzabile non appena inizia principali? Come funziona atexit lavoro?

Lo standard C richiede la libreria standard hanno un'API segnali POSIX-like, che su Windows deve essere "installato" prima di main ().

Nella maggior parte dei sistemi operativi, non c'è mucchio fornita dal sistema; il runtime C implementa il proprio mucchio (runtime di Microsoft C solo avvolge le funzioni Kernel32 Heap).

Anche gli argomenti passati al principale, argc e argv, devono essere ottenuti dal sistema in qualche modo.

Si potrebbe voler dare un'occhiata a (antichi) articoli di Matt Pietrick sull'attuazione proprio runtime C per le specifiche su come questo funziona con Windows + MSVC (nota: MinGW e Cygwin implementare cose specifiche in modo diverso, ma in realtà ricadere MSVCRT per la maggior parte delle cose): http://msdn.microsoft.com/en-us/library/bb985746.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top