DLLHUSK.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // dllhusk.cpp : Defines the class behaviors for the application.
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "dllhusk.h"
  14. #include "mainfrm.h"
  15. #include "testdll1.h"   // classes exported from TESTDLL1
  16. #include "testdll2.h"   // classes exported from TESTDLL2
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char BASED_CODE THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CHuskApp
  23. BEGIN_MESSAGE_MAP(CHuskApp, CWinApp)
  24. //{{AFX_MSG_MAP(CHuskApp)
  25. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  26. ON_COMMAND(ID_DUMP_CLASSES, OnDumpClasses)
  27. ON_COMMAND(ID_DUMP_DOCTEMPLATES, OnDumpDocTemplates)
  28. ON_COMMAND(ID_DUMP_OBJECTS, OnDumpObjects)
  29. ON_COMMAND(ID_DUMP_DLLS, OnDumpDLLs)
  30. //}}AFX_MSG_MAP
  31. // Standard file based document commands
  32. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  33. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  34. ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CHuskApp construction
  38. // Place all significant initialization in InitInstance
  39. CHuskApp::CHuskApp()
  40. {
  41. m_pListOut = NULL;
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. // The one and only CHuskApp object
  45. CHuskApp NEAR theApp;
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CHuskApp initialization
  48. BOOL CHuskApp::InitInstance()
  49. {
  50. // Standard initialization
  51. Enable3dControls(); // use 3d controls in dialogs
  52. LoadStdProfileSettings();  // Load standard INI file options (including MRU)
  53. // create main MDI Frame window
  54. CMainFrame* pMainFrame = new CMainFrame;
  55. if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
  56. return FALSE;
  57. pMainFrame->ShowWindow(m_nCmdShow);
  58. pMainFrame->UpdateWindow();
  59. m_pMainWnd = pMainFrame;
  60. // Initialize DLLs - will add doc templates and make other class
  61. //   implementations available to this application
  62. InitTestDLL1();
  63. InitTestDLL2();
  64. CreateListOutput();
  65. if (m_lpCmdLine[0] == '')
  66. {
  67. if (m_pListOut != NULL)
  68. m_pListOut->AddString(_T("Attempting to create a new document"));
  69. // create a new (empty) document
  70. OnFileNew();
  71. }
  72. else
  73. {
  74. if (m_pListOut != NULL)
  75. m_pListOut->AddString(_T("Attempting to open an existing document"));
  76. // open an existing document
  77. OpenDocumentFile(m_lpCmdLine);
  78. }
  79. #ifdef _DEBUG
  80. if (m_pListOut != NULL)
  81. {
  82. m_pListOut->AddString(_T(""));
  83. m_pListOut->AddString(_T("Click the Right-Mouse-Button over"));
  84. m_pListOut->AddString(_T(" the main TitleBar for diagnostic menu"));
  85. m_pListOut->AddString(_T(""));
  86. }
  87. #endif
  88. return TRUE;
  89. }
  90. // Example of calling a class in a DLL
  91. BOOL CHuskApp::CreateListOutput()
  92. {
  93. m_pListOut = new CListOutputFrame;
  94. // all objects are allocated on the application's heap,
  95. //  even CListOutputFrame which is defined in another DLL
  96. CRect rectOriginal(250, 0, 600, 300);
  97. // hard-coded initial position
  98. if (!m_pListOut->Create(_T("List Output"),
  99. WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE,
  100. rectOriginal, (CMDIFrameWnd*)m_pMainWnd))
  101. {
  102. AfxMessageBox(_T("Failed to create ListOutput Window"));
  103. m_pListOut = NULL;  // just in case (Create will delete the C++ object)
  104. return FALSE;
  105. }
  106. m_pListOut->SetBackpointer(&m_pListOut);
  107. return TRUE;
  108. }
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CAboutDlg dialog used for App About
  111. void CHuskApp::OnAppAbout()
  112. {
  113. if (m_pListOut != NULL)
  114. m_pListOut->AddString(_T("CHuskApp::OnAppAbout called"));
  115. CDialog(IDD_ABOUTBOX).DoModal();
  116. }
  117. /////////////////////////////////////////////////////////////////////////////
  118. // CHuskApp debug menu dump commands
  119. #ifdef _DEBUG
  120. static void DumpObjectProc(CObject* pObject, void* pContext)
  121. {
  122. CListOutputFrame* pListOut = (CListOutputFrame*)pContext;
  123. TCHAR szT[128];
  124. wsprintf(szT, _T("    a %s at $%08lX"),
  125. pObject->GetRuntimeClass()->m_lpszClassName, (long)(void*)pObject);
  126. pListOut->AddString(szT);
  127. }
  128. static void DumpClassProc(const CRuntimeClass* pClass, void* pContext)
  129. {
  130. CListOutputFrame* pListOut = (CListOutputFrame*)pContext;
  131. TCHAR szT[128];
  132. wsprintf(szT, _T("    %s"), pClass->m_lpszClassName);
  133. pListOut->AddString(szT);
  134. }
  135. #endif
  136. void CHuskApp::OnDumpClasses()
  137. {
  138. #ifdef _DEBUG
  139. if (m_pListOut == NULL && !CreateListOutput())
  140. return; // no output window
  141. m_pListOut->AddString(_T("Dump of all classes:"));
  142. AfxDoForAllClasses(DumpClassProc, m_pListOut);
  143. m_pListOut->AddString(_T(""));
  144. #endif
  145. }
  146. void CHuskApp::OnDumpDocTemplates()
  147. {
  148. #ifdef _DEBUG
  149. if (m_pListOut == NULL && !CreateListOutput())
  150. return; // no output window
  151. m_pListOut->AddString(_T("Dump of all Doc Templates:"));
  152. POSITION pos = GetFirstDocTemplatePosition();
  153. while (pos != NULL)
  154. {
  155. CDocTemplate* pTemplate = GetNextDocTemplate(pos);
  156. CString str;
  157. TCHAR szT[128];
  158. if (pTemplate->GetDocString(str, CDocTemplate::fileNewName))
  159. wsprintf(szT, _T("    Template for %s documents"), (LPCTSTR)str);
  160. else
  161. wsprintf(szT, _T("    Unknown DocTemplate at $%08lX"),
  162. (long)(void*)pTemplate);
  163. m_pListOut->AddString(szT);
  164. }
  165. m_pListOut->AddString(_T(""));
  166. #endif
  167. }
  168. void CHuskApp::OnDumpObjects()
  169. {
  170. #ifdef _DEBUG
  171. if (m_pListOut == NULL && !CreateListOutput())
  172. return; // no output window
  173. m_pListOut->AddString(_T("Dump of all heap Objects"));
  174. AfxDoForAllObjects(DumpObjectProc, m_pListOut);
  175. m_pListOut->AddString(_T(""));
  176. #endif
  177. }
  178. void CHuskApp::OnDumpDLLs()
  179. {
  180. #ifdef _DEBUG
  181. if (m_pListOut == NULL && !CreateListOutput())
  182. return; // no output window
  183. m_pListOut->AddString(_T("Dump of DLLs in resource search order"));
  184. AFX_MODULE_STATE* pState = AfxGetModuleState();
  185. for (CDynLinkLibrary* pDLL = pState->m_libraryList; pDLL != NULL;
  186. pDLL = pDLL->m_pNextDLL)
  187. {
  188. // get module name
  189. TCHAR szName[64];
  190. GetModuleFileName(pDLL->m_hModule, szName, sizeof(szName));
  191. TCHAR szT[256];
  192. // count classes
  193. int nClasses = 0;
  194. for (CRuntimeClass* pClass = pDLL->m_classList;
  195. pClass != NULL; pClass = pClass->m_pNextClass)
  196. nClasses++;
  197. // count factories
  198. int nFactories = 0;
  199. #ifndef _AFX_NO_OLE_SUPPORT
  200. for (COleObjectFactory* pFactory = pDLL->m_factoryList;
  201. pFactory != NULL; pFactory = pFactory->m_pNextFactory)
  202. nFactories++;
  203. #endif
  204. wsprintf(szT, _T("    Module %s has %d classes and %d factories"),
  205. szName, nClasses, nFactories);
  206. m_pListOut->AddString(szT);
  207. }
  208. m_pListOut->AddString(_T(""));
  209. #endif
  210. }
  211. /////////////////////////////////////////////////////////////////////////////