2011-08-30 17 views
11

Ho un'applicazione C++ Win32 scritta utilizzando l'API Win32 e desidero forzare l'uscita in una delle funzioni. C'è qualcosa come Exit() o Destroy() o Abort() qualcosa di simile che lo interromperebbe?Come uscire dall'applicazione Win32 tramite API?

+1

Quanto è forte il bisogno di essere? –

+1

Bene, smettila subito, senza continuare. – bodacydo

risposta

1

ExitProcess è la funzione da usare, altrimenti è possibile utilizzare exit, notare che né assicurare l'integrità del shutdown (es .: molti handle di perdite ecc. e le operazioni filettate verranno interrotte, anche se sono a metà di un'operazione, come un commit db)

12

PostQuitMessage() è il modo standard e agevole di uscire da un'applicazione con finestre.

Non si chiuderà immediatamente ma pubblicherà un messaggio di uscita che verrà analizzato dal loop principale (se eseguito correttamente) e quindi uscirà dall'applicazione.

5

Se si utilizza un'applicazione Win32 con una procedura di finestra appropriata, è possibile utilizzare la funzione PostQuitMessage.

2

appena tornati dalla funzione WinMain. Se si dispone di un loop di messaggi, utilizzare PostQuitMessage per uscire. Non cercare di uscire dal processo durante l'esecuzione; è sciatto.

25

Aiiieeeeeeeeeeee. Non fare NESSUNO di queste cose!

  • uscita() e ExitProcess sono l'equivalente di una pistola e sparare il processo in faccia. Spero di non dover spiegare perché non è bello, specialmente per i processi che contengono oggetti condivisi come handle di database che potrebbero essere di sistema. So che è la norma in Android, ma questo è Windows e non lo facciamo qui.

  • Chiamare PostQuitMessage() direttamente può causare perdite di memoria. PostQuitMessage() è progettato per essere chiamato da WM_DESTROY. NON è NOT un messaggio destinato ad essere usato per chiedere a una finestra di chiudersi. È un meccanismo di callback per le applicazioni che inviano il loro codice di uscita alla shell. Si intende compilare WM_QUIT con il codice di uscita dell'applicazione. Se chiamate direttamente PostQuitMessage(), ignorerete interamente WM_DESTROY. Questo è problematico perché molte finestre - e widget figlio - sono molto corretti perform their clean-up in WM_DESTROY. Se salti questo messaggio mentendo alla finestra, negherai ai componenti la possibilità di ripulire.

  • E poiché siamo sull'argomento, non chiamare direttamente WM_DESTROY . Raymond Chen di Microsoft ha un articolo meraviglioso in cui spiega "Sending a window a WM_DESTROY message is like prank calling somebody pretending to be the police". È una specie di gemello malvagio di PostQuitMessage. Invece di uscire senza ripulire, stai chiedendo alla finestra di pulire senza uscire. Il window manager non sa mai di rimuovere i componenti, e ti rimane una finestra orfana morta in memoria. Sospiro.

La risposta corretta è pubblicare WM_CLOSE. Qualsiasi cosa utilizzi la procedura di finestra predefinita notificherà correttamente al gestore di finestre di distruggere la finestra che si sovrapporrà a WM_DESTROY quindi a WM_QUIT come previsto.

Se è necessario un comportamento diverso rispetto alla chiusura standard, l'altra alternativa è creare un messaggio WM_USER o WM_APP. Se la tua finestra ha una "fantasia" WM_CLOSE - ad esempio, dai all'utente un messaggio "Sei sicuro di voler uscire?" - e vuoi saltarlo, puoi definire un messaggio personalizzato con WM_USER o WM_APP e chiamalo al suo posto. Il messaggio definito dall'app implementerà il comportamento di chiusura predefinito e il WM_CLOSE associato ai gadget di sistema esegue il tuo comportamento di fantasia.

Spero che questo aiuti!

Problemi correlati