MailService.cpp
上传用户:qdlutongda
上传日期:2007-01-14
资源大小:133k
文件大小:3k
源码类别:

Email客户端

开发平台:

Visual C++

  1. #include <stdafx.h>
  2. //#include <windows.h>
  3. #include "MailService.h"
  4. extern  UINT main_mailsvr(LPVOID pParam);
  5. extern  bool Ini_MailCom();
  6. extern  void Release_MailCom();
  7. CMailService::CMailService()
  8. : CNTService(TEXT("SmartMailService"), TEXT("M-Office Smart Mail Server"))
  9. , m_hStop(0)
  10. , m_hPause(0)
  11. , m_hContinue(0)
  12. {
  13. m_dwControlsAccepted = 0;
  14. m_dwControlsAccepted |= SERVICE_ACCEPT_STOP;
  15. m_dwControlsAccepted |= SERVICE_ACCEPT_PAUSE_CONTINUE;
  16. m_dwControlsAccepted |= SERVICE_ACCEPT_SHUTDOWN;
  17. m_dwServiceType |= SERVICE_INTERACTIVE_PROCESS;
  18. }
  19. void CMailService::Run(DWORD dwArgc, LPTSTR * ppszArgv) {
  20. // report to the SCM that we're about to start
  21. ReportStatus(SERVICE_START_PENDING);
  22. m_hStop = ::CreateEvent(0, TRUE, FALSE, 0);
  23. m_hPause = ::CreateEvent(0, TRUE, FALSE, 0);
  24. m_hContinue = ::CreateEvent(0, TRUE, FALSE, 0);
  25. // TODO: You might do some initialization here.
  26. //  Parameter processing for instance ...
  27. //  If this initialization takes a long time,
  28. //  don't forget to call "ReportStatus()"
  29. //  frequently or adjust the number of milliseconds
  30. //  in the "ReportStatus()" above.
  31. // report SERVICE_RUNNING immediately before you enter the main-loop
  32. // DON'T FORGET THIS!
  33. ReportStatus(SERVICE_RUNNING);
  34. //addtional code by Qian Xuezheng
  35. if(!Ini_MailCom())
  36. return ;
  37. DWORD dwThreadID;
  38. HANDLE hThread = CreateThread(NULL, 
  39.   0,
  40.   (LPTHREAD_START_ROUTINE)main_mailsvr, 
  41.   NULL,
  42.   0,
  43.   &dwThreadID);
  44. if(hThread == NULL)
  45. return ;
  46. DWORD dExitCode=-1;
  47. // main-loop
  48. // If the Stop() method sets the event, then we will break out of
  49. // this loop.
  50. while( ::WaitForSingleObject(m_hStop, 10) != WAIT_OBJECT_0 ) {
  51. // if the service got a "pause" request, wait until the user
  52. // wants to "continue".
  53. if(dExitCode == -1)
  54. {
  55. if(::WaitForSingleObject(hThread,10) == WAIT_OBJECT_0 ) 
  56. {
  57. GetExitCodeThread(hThread,&dExitCode);
  58. if(dExitCode==0)
  59. break;
  60. }
  61. }
  62. if(::WaitForSingleObject(m_hPause, 5) == WAIT_OBJECT_0) {
  63. while(::WaitForSingleObject(m_hContinue, 50) != WAIT_OBJECT_0)
  64. if(::WaitForSingleObject(m_hPause, 50) == WAIT_OBJECT_0)
  65. goto Stop;
  66. ::ResetEvent(m_hPause);
  67. ::ResetEvent(m_hContinue);
  68. }
  69. // TODO: Enter your service's real functionality here
  70. }
  71. Stop:
  72. if( m_hStop )
  73. {
  74. ::CloseHandle(m_hStop);
  75. Release_MailCom();
  76. }
  77. if(m_hPause)
  78. ::CloseHandle(m_hPause);
  79. if(m_hContinue)
  80. ::CloseHandle(m_hContinue);
  81. }
  82. void CMailService::Stop() {
  83. // report to the SCM that we're about to stop
  84. // TODO: Adjust the number of milliseconds you think
  85. //  the stop-operation may take.
  86. ReportStatus(SERVICE_STOP_PENDING, 5000);
  87. if( m_hStop )
  88. ::SetEvent(m_hStop);
  89. }
  90. void CMailService::Pause() {
  91. ReportStatus(SERVICE_PAUSE_PENDING);
  92. if(m_hPause)
  93. ::SetEvent(m_hPause);
  94. // TODO: add additional "pause" code here
  95. ReportStatus(SERVICE_PAUSED);
  96. }
  97. void CMailService::Continue() {
  98. ReportStatus(SERVICE_CONTINUE_PENDING);
  99. // TODO: add additional "continue" code here
  100. if(m_hContinue)
  101. ::SetEvent(m_hContinue);
  102. ReportStatus(SERVICE_RUNNING);
  103. }
  104. void CMailService::Shutdown() {
  105. if(m_hStop)
  106. ::SetEvent(m_hStop);
  107. // TODO: add code here that will be executed when the system shuts down
  108. }