| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- // 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_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // DDE and ShellExecute support
- BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo)
- {
- BOOL bResult = TRUE;
- switch (rCmdInfo.m_nShellCommand)
- {
- case CCommandLineInfo::FileNew:
- if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL))
- OnFileNew();
- if (m_pMainWnd == NULL)
- bResult = FALSE;
- break;
- // If we've been asked to open a file, call OpenDocumentFile()
- case CCommandLineInfo::FileOpen:
- if (!OpenDocumentFile(rCmdInfo.m_strFileName))
- bResult = FALSE;
- break;
- // If the user wanted to print, hide our main window and
- // fire a message to ourselves to start the printing
- case CCommandLineInfo::FilePrintTo:
- case CCommandLineInfo::FilePrint:
- m_nCmdShow = SW_HIDE;
- ASSERT(m_pCmdInfo == NULL);
- OpenDocumentFile(rCmdInfo.m_strFileName);
- m_pCmdInfo = &rCmdInfo;
- m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT);
- m_pCmdInfo = NULL;
- bResult = FALSE;
- break;
- // If we're doing DDE, hide ourselves
- case CCommandLineInfo::FileDDE:
- m_pCmdInfo = (CCommandLineInfo*)m_nCmdShow;
- m_nCmdShow = SW_HIDE;
- break;
- // If we've been asked to unregister, unregister and then terminate
- case CCommandLineInfo::AppUnregister:
- {
- UnregisterShellFileTypes();
- BOOL bUnregistered = Unregister();
- // if you specify /EMBEDDED, we won't make an success/failure box
- // this use of /EMBEDDED is not related to OLE
- if (!rCmdInfo.m_bRunEmbedded)
- {
- if (bUnregistered)
- AfxMessageBox(AFX_IDP_UNREG_DONE);
- else
- AfxMessageBox(AFX_IDP_UNREG_FAILURE);
- }
- bResult = FALSE; // that's all we do
- // If nobody is using it already, we can use it.
- // We'll flag that we're unregistering and not save our state
- // on the way out. This new object gets deleted by the
- // app object destructor.
- if (m_pCmdInfo == NULL)
- {
- m_pCmdInfo = new CCommandLineInfo;
- m_pCmdInfo->m_nShellCommand = CCommandLineInfo::AppUnregister;
- }
- }
- break;
- }
- return bResult;
- }
- BOOL CWinApp::Unregister()
- {
- HKEY hKey = 0;
- TCHAR szBuf[MAX_PATH+1];
- LONG cSize;
- BOOL bRet = TRUE;
- POSITION pos = GetFirstDocTemplatePosition();
- while (pos != NULL)
- {
- CDocTemplate* pTempl = GetNextDocTemplate(pos);
- if (pTempl != NULL)
- pTempl->OnCmdMsg(0, CN_OLE_UNREGISTER, NULL, NULL);
- }
- // Remove profile information -- the registry entries exist if
- // SetRegistryKey() was used.
- if (m_pszRegistryKey)
- {
- ASSERT(m_pszProfileName);
- CString strKey = _T("Software\\");
- strKey += m_pszRegistryKey;
- CString strSubKey = strKey + _T("\\") + m_pszProfileName;
- DelRegTree(HKEY_CURRENT_USER, strSubKey);
- // If registry key is empty then remove it
- DWORD dwResult;
- if ((dwResult = ::RegOpenKey(HKEY_CURRENT_USER, strKey, &hKey)) ==
- ERROR_SUCCESS)
- {
- if (::RegEnumKey(hKey, 0, szBuf, _MAX_PATH) == ERROR_NO_MORE_ITEMS)
- DelRegTree(HKEY_CURRENT_USER, strKey);
- ::RegCloseKey(hKey);
- }
- if (RegQueryValue(HKEY_CURRENT_USER, strSubKey, szBuf, &cSize) == ERROR_SUCCESS)
- bRet = TRUE;
- }
- return bRet;
- }
- // Under Win32, a reg key may not be deleted unless it is empty.
- // Thus, to delete a tree, one must recursively enumerate and
- // delete all of the sub-keys.
- LONG CWinApp::DelRegTree(HKEY hParentKey, const CString& strKeyName)
- {
- return AfxDelRegTreeHelper(hParentKey, strKeyName);
- }
- LONG AFXAPI AfxDelRegTreeHelper(HKEY hParentKey, const CString& strKeyName)
- {
- TCHAR szSubKeyName[256];
- HKEY hCurrentKey;
- DWORD dwResult;
- if ((dwResult = RegOpenKey(hParentKey, strKeyName, &hCurrentKey)) ==
- ERROR_SUCCESS)
- {
- // Remove all subkeys of the key to delete
- while ((dwResult = RegEnumKey(hCurrentKey, 0, szSubKeyName, 255)) ==
- ERROR_SUCCESS)
- {
- if ((dwResult = AfxDelRegTreeHelper(hCurrentKey, szSubKeyName)) != ERROR_SUCCESS)
- break;
- }
- // If all went well, we should now be able to delete the requested key
- if ((dwResult == ERROR_NO_MORE_ITEMS) || (dwResult == ERROR_BADKEY))
- {
- dwResult = RegDeleteKey(hParentKey, strKeyName);
- }
- }
- RegCloseKey(hCurrentKey);
- return dwResult;
- }
- void CWinApp::EnableShellOpen()
- {
- ASSERT(m_atomApp == NULL && m_atomSystemTopic == NULL); // do once
- m_atomApp = ::GlobalAddAtom(m_pszExeName);
- m_atomSystemTopic = ::GlobalAddAtom(_T("system"));
- }
- void CWinApp::RegisterShellFileTypes(BOOL bCompat)
- {
- ASSERT(m_pDocManager != NULL);
- m_pDocManager->RegisterShellFileTypes(bCompat);
- }
- void CWinApp::RegisterShellFileTypesCompat()
- {
- ASSERT(m_pDocManager != NULL);
- m_pDocManager->RegisterShellFileTypes(TRUE);
- }
- void CWinApp::UnregisterShellFileTypes()
- {
- ASSERT(m_pDocManager != NULL);
- m_pDocManager->UnregisterShellFileTypes();
- }
- #ifdef AFX_CORE2_SEG
- #pragma code_seg(AFX_CORE2_SEG)
- #endif
- int CWinApp::GetOpenDocumentCount()
- {
- ASSERT(m_pDocManager != NULL);
- return m_pDocManager->GetOpenDocumentCount();
- }
- /////////////////////////////////////////////////////////////////////////////
- // Doc template support
- #ifdef AFX_CORE3_SEG
- #pragma code_seg(AFX_CORE3_SEG)
- #endif
- void CWinApp::AddDocTemplate(CDocTemplate* pTemplate)
- {
- if (m_pDocManager == NULL)
- m_pDocManager = new CDocManager;
- m_pDocManager->AddDocTemplate(pTemplate);
- }
- POSITION CWinApp::GetFirstDocTemplatePosition() const
- {
- if (m_pDocManager == NULL)
- return NULL;
- return m_pDocManager->GetFirstDocTemplatePosition();
- }
- CDocTemplate* CWinApp::GetNextDocTemplate(POSITION& rPosition) const
- {
- ASSERT(m_pDocManager != NULL);
- return m_pDocManager->GetNextDocTemplate(rPosition);
- }
- /////////////////////////////////////////////////////////////////////////////
|