////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ServiceMain() // Called by the Service Manager. VOID WINAPI ServiceMain( DWORD dwArgs, LPTSTR *ppszArgs) { HWND hWnd = NULL; LPCTSTR pszServiceName = ppszArgs[0]; // // Record this ServiceMain's thread ID for other threads to use. // gServiceMainThreadID = GetCurrentThreadId(); ALERT( "ServiceMain: function started. Passed inn Name is...\n" ); ALERT( pszServiceName ); ALERT( "ServiceMain: About to call RegisterServiceCtrlHandler()...\n" ); // Test to see if we can cause the message loop to start queuing... SetTimeoutTimer( 10 ); CleanStatusStruct( &gServiceStatus ); gServiceStatus.dwCurrentState = SERVICE_START_PENDING; ghService = RegisterServiceCtrlHandler( pszServiceName, ServiceHandler ); if( 0 != ghService ) { ALERT( "ServiceMain: Just came out of RegisterServiceCtrlHandler()" ); // If the state has not yet changed then push start everything... if( 0 == gdwState ) { gdwState = SERVICE_START_PENDING; // // If we are in callback mode then make sure to // start by posting a SERVICE_START_PENDING message // (even though one does not exist in the Win32 API) // so the script has a chance to start. // if( FALSE != gfCallbackMode ) { // // Call the service handler indicating that the "fake" // SERVICE_CONTROL_START event has been received. // ServiceHandler( SERVICE_CONTROL_START ); } } { char szBuffer[256]; sprintf( szBuffer, "ServiceMain: About to call My_SetServiceBits with gdwServiceBits=0x%08x", gdwServiceBits ); ALERT( szBuffer ); } if( 0 != gdwServiceBits ) { My_SetServiceBits( ghService, gdwServiceBits, TRUE, TRUE ); } ALERT( "ServiceMain: Entering message loop" ); // Call a Win32 User level function to create a message queue GetDesktopWindow(); GetWindow( NULL, GW_HWNDFIRST ); if( 1 ) { MSG Message; BOOL fContinueProcessing = TRUE; while( TRUE == fContinueProcessing ) { ALERT( "ServiceMain: Just enetered the message loop" ); try { fContinueProcessing = (BOOL) GetMessage( &Message, (HWND) NULL, 0, 0 ); #ifdef _DEBUG TCHAR szBuffer[256]; wsprintf( szBuffer, "Got message: 0x%08x", Message.message ); ALERT( szBuffer ); #endif // _DEBUG } catch (...) { ALERT( "ServiceMain: Ouch!!! We caught an exception!" ); } switch( Message.message ) { case WM_USER_SET_TIMER: ALERT( "ServiceMain: Setting timer" ); ghTimer = ::SetTimer( NULL, SERVICE_THREAD_TIMER_ID, (UINT)Message.wParam * DEFAULT_HANDLER_TIMEOUT_SCALE, (TIMERPROC)TimerHandler ); break; case WM_QUIT: fContinueProcessing = FALSE; break; case WM_QUERYENDSESSION: case WM_ENDSESSION: case WM_TIMER: ALERT( "ServiceMain: HandlerTimeoutTimer due to WM_TIMER." ); KillTimer(); gdwState = gdwTimeoutState; UpdateServiceStatus( gdwTimeoutState ); default: ALERT( "ServiceMain: Dispatching message." ); TranslateMessage( &Message ); // // Calling DispatchMessage() is probably foolish since // there is no window associated with this thread. // Per MSDN: messages that are not associated with a window cannot be dispatched by the DispatchMessage function DispatchMessage( &Message ); } } } ALERT( "ServiceMain: Just left the message loop." ); UpdateServiceStatus( gdwState ); } else { gdwState = SERVICE_STOPPED; #ifdef _DEBUG TCHAR szBuffer[ 100 ]; wsprintf( szBuffer, TEXT( "ServiceMain: ERROR! 0x08x" ), GetLastError() ); ALERT( szBuffer ); #endif // _DEBUG } ALERT( "ServiceMain: Shutting down ServiceMain()!" ); return; }
ServiceHandler^ ServiceHandleManager::AcquireServiceHandler() { // 初始化ServiceHandler ServiceHandler^ pServiceHandler = gcnew ServiceHandler(this->Owner); m_Lock.Enter(); try { m_StockHandlerManager.Add(pServiceHandler); } finally { m_Lock.Exit(); } return pServiceHandler; }