2013-03-28 14 views
5

WinMain è una funzione che "sostituisce" il punto di ingresso principale predefinito "principale".C++: implementazione personalizzata Funzione principale

L'utente può quindi definire il suo principale punto di accesso come

int WINAPI WinMain(...) { } 


Come è questo tipo di incapsulamento fatto?

Beh, molto probabilmente, ad un certo punto sembra che questo:

int main() // This must be defined somewhere in windows.h 
{ 
    return WinMain(...); 
} 

Domanda: Come posso realizzare una tale incapsulamento del mio, che poi chiama WinMain? Nota: La biblioteca, che ho fatto è una DLL, in modo che sarà simile a questa:

// This is the minimal code for the application which uses 'MyLibrary' 
#pragma comment(lib, "MyLibrary.lib") 
include "MyLibrary.h" 

void Main(MyCustomParameter *params) 
{ 
    // Write user code here 
} 

Il problema Comunque sia, che la DLL non 'sa' la funzione Main() e lancia quindi un 'irrisolto simbolo esterno 'errore di compilazione. Quindi come posso incapsularlo in questo modo?

risposta

3

si deve decidere su una firma della tua funzione principale personalizzato e dichiarare come "Esterno" (extern "C" in caso di C++). Quindi, il codice dell'applicazione dovrà definire tale funzione e collegarsi alla libreria statica che ha il punto di ingresso effettivo _main. Ad esempio:

extern "C" int my_main(int argc, char *argv[]); 

int main(int argc, char *argv[]) 
{ 
    return my_main(argc, argv); 
} 
+0

Ho ancora un esterno non risolto, anche con "extern" C "'. È perché utilizzo WinMain come punto di ingresso interno anziché come main come fai tu? – bytecode77

+0

@DevilsChild: È difficile dire cosa si fa. Se il tuo punto di ingresso è 'WinMain' - chiama il tuo main da' WinMain'. Se è solo 'main()' - chiamalo da 'main()'. Ottieni il tuo codice per compilare senza modifiche prima, poi apporta le modifiche e vedi quali interruzioni. O almeno metti un esempio completo minimale che dimostri il tuo problema ... altrimenti è difficile fare il debug di quello che stai facendo. –

+0

Apparentemente, è un problema con la struttura di inclusione. Ho messo insieme un codice molto minimalista qui: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip Quando non includo 'ExampleClass.h' funziona. – bytecode77

2

Il nome del punto di ingresso predefinito del linker è "main". È possibile sovrascrivere il valore predefinito per iniziare con qualsiasi funzione desiderata.

/ENTRY (Entry-Point Symbol)

2

In realtà, il vero punto di ingresso non è né principale né WinMain. Il vero punto di ingresso è uno di wWinMainCRTStartup, WinMainCRTStartup, wmainCRTStartup e mainCRTStartup. Ma non sono definiti in Windows.h, fanno parte del CRT. Puoi vedere il loro codice in <VS installation folder> \ VC \ crt \ src \ crtexe.c. Ognuno di essi esegue un'inizializzazione e quindi chiama uno dei seguenti wWinMain, WinMain, wmain e main.

Come menzionato da qualcun altro, è possibile ignorare il punto di ingresso con l'opzione/ENTRY, ma non è ancora possibile avere parametri personalizzati, che è l'intera ragione per cui si desidera eseguire questa operazione in primo luogo.

+0

Sapevo della cosa MainCRTStartup, ma posso davvero usare parametri personalizzati. Il mio tentativo è qui: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip Non funziona a causa di alcuni problemi di inclusione sconosciuti, ma quando si rimuove il 'ExampleClass 'es, vedrai che funziona. Il problema rimanente ora è la struttura include che non funziona ancora. – bytecode77

Problemi correlati