home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
olelock.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
3KB
|
106 lines
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFX_CORE4_SEG
#pragma code_seg(AFX_CORE4_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Global functions which handle app shutdown
// Note: these functions can be replaced by replacing this module in its
// entirety (although doing so would be rare).
void AFXAPI AfxOleOnReleaseAllObjects()
{
// don't shut down the application if user is in control of the app
if (AfxOleGetUserCtrl())
return;
AfxOleSetUserCtrl(TRUE); // avoid re-entry
// shut down the application
CWinApp* pApp = AfxGetApp();
if (pApp != NULL && pApp->m_pMainWnd != NULL)
{
// destroy the main window (only if enabled)
if (pApp->m_pMainWnd->IsWindowEnabled())
{
// the main window will post WM_QUIT as part of its shutdown
pApp->m_pMainWnd->DestroyWindow();
}
}
else if (!afxContextIsDLL)
{
// no main window, so just post WM_QUIT.
AfxPostQuitMessage(0);
}
}
BOOL AFXAPI AfxOleCanExitApp()
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
return pModuleState->m_nObjectCount == 0;
}
void AFXAPI AfxOleLockApp()
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
InterlockedIncrement(&pModuleState->m_nObjectCount);
}
void AFXAPI AfxOleUnlockApp()
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
ASSERT(pModuleState->m_nObjectCount != 0);
if (InterlockedDecrement(&pModuleState->m_nObjectCount) == 0)
{
// allow application to shut down when all the objects have
// been released
::AfxOleOnReleaseAllObjects();
}
}
/////////////////////////////////////////////////////////////////////////////
// Access to "user-control" state
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl)
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
#ifdef _DEBUG
CWinApp* pApp = AfxGetApp();
if (bUserCtrl && !pModuleState->m_bUserCtrl &&
(pApp == NULL || pApp->m_pMainWnd == NULL ||
!pApp->m_pMainWnd->IsWindowVisible()))
{
// If the user gets control while the application window is
// not visible, the application may not shutdown when the object
// count reaches zero.
TRACE0("Warning: AfxOleSetUserCtrl(TRUE) called with application window hidden.\n");
}
#endif
pModuleState->m_bUserCtrl = bUserCtrl;
}
BOOL AFXAPI AfxOleGetUserCtrl()
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
return pModuleState->m_bUserCtrl;
}
/////////////////////////////////////////////////////////////////////////////