"Mechi" <mechif@gmail.com> wrote in message
news:1b276b24-818f-42e2-9557-30b7570a16dd@d10g2000yqh.googlegroups.com...
Hi!
I have a dialog based application. It always exits with 20 - though i
think it should exit with 0.
In a dialog application, you typically show the dialog in
InitInstance(), wait for the DoModal() call to return, then return FALSE
from InitInstance() so your app closes without starting a message pump.
Because you do not override ExitInstance() (and it is not even called)
in this scenario, you don't have the ability to set a proper return
code. Essentially the return code is garbage depending on the last
message pumped, I believe.
Bottom line is if you care about the return code, you can't call
DoModal() in InitInstance() like this. Instead you need to start a
message pump so that ExitInstance is called. This typically means
showing a CMainFrame (perhaps with no menu bar, toolbar, or status bar)
containing a CFormView of your original dialog.
The only thread that is opened is the
GUI/dialog itself. I open and then immediately (afte GUI is
displayed) close the application.
after
int nResponse = dlg.DoModal();
CoUninitialize();
I call (just to be able to catch the error):
int err = theApp.ExitInstance();
err returns = 20.
I don't know how CWinApp::ExitInstance() determines it's return value,
but it doesn't really matter because there is no way for you to then set
this value to the return value of your app.
I traced into thrdcore.cpp, below.
MSG* AFXAPI AfxGetCurrentMessage()
{
_AFX_THREAD_STATE* pState = AfxGetThreadState();
ASSERT(pState);
return &(pState->m_msgCur);
}
There is obviously a thread wtill running - as I saw in the Thread
list:
3084 __tmainCRTStartup CCamelotSampleApp::InitInstance Normal 0
2244 Win32 Thread _KiFastSystemCallRet@0 Normal 0
How do I ensure that the GUI thread closes before the application
does?
It does. But you haven't returned from CCamelotSampleApp::InitInstance()
yet when you look at the call stack; you are looking too early.
-- David
target. CWinApp is derived from CWinThread, and when InitInstance
returns false, this leads to a call to pThread->ExitInstance. This
becomes a call to CWinApp::ExitInstance. If AfxGetCurrentMessage
the wParam from that message.
from GUI app is appropriate here. A simple debugging session should