Exemplo n.º 1
-7
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  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;
			}