سؤال

أستخدم VS6 وATL مع CServiceModule لتنفيذ خدمة Windows مخصصة.في حالة حدوث خطأ فادح يجب أن تغلق الخدمة نفسها.نظرًا لأن CServiceModule متاح عبر متغير _Module في جميع الملفات، فقد فكرت في شيء كهذا يتسبب في توقف CServiceModule::Run عن ضخ الرسائل وإغلاق نفسه

PostThreadMessage(_Module.dwThreadID, WM_QUIT, 0, 0);

هل هذا صحيح أم أن لديك فكرة أفضل؟

هل كانت مفيدة؟

المحلول

لاغلاق النفس ترسل الأوامر لإدارة خدمة. محاولة هذه العينة:


BOOL StopServiceCmd ( const char * szServiceName )
{ 
    SC_HANDLE schService; 
    SC_HANDLE schSCManager; 
    SERVICE_STATUS ssStatus;       // current status of the service 
    BOOL bRet;
    int iCont=0;

    schSCManager = OpenSCManager( 
        NULL, // machine (NULL == local) 
        NULL, // database (NULL == default) 
        SC_MANAGER_ALL_ACCESS // access required 
        ); 
    if ( schSCManager ) 
    { 
        schService = OpenService(schSCManager, szServiceName, SERVICE_ALL_ACCESS); 

        if (schService) 
        { 
            // try to stop the service 
            if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) ) 
            { 
                Sleep( 1000 ); 

                while( QueryServiceStatus( schService, &ssStatus ) ) 
                { 
                    iCont++;
                    if ( ssStatus.dwCurrentState == SERVICE_STOP_PENDING ) 
                    { 
                        Sleep( 1000 ); 
                        if ( iCont > 4 ) break;
                    } 
                    else 
                        break; 
                } 

                if ( ssStatus.dwCurrentState == SERVICE_STOPPED ) 
                    bRet = TRUE; 
                else 
                    bRet = FALSE; 
            } 

            CloseServiceHandle(schService); 
        } 
        else 
            bRet = FALSE; 

        CloseServiceHandle(schSCManager); 
    } 
    else 
        bRet = FALSE;

    return bRet;
} 

نصائح أخرى

وأعتقد أنه إذا قمت بذلك، ثم مدير خدمة يعتقدون أن الخدمة قد تحطمت وإذا كان المستخدم من أي وقت مضى يضعه لإعادة التشغيل التلقائي، وسوف.

في .NET، استخدام ServiceController للإشارة إلى الخدمة لإيقاف. أتوقع أنه يشبه في Win32 لأن معظم هذه الاشياء في. NET غير مغلفة فقط. آسف، أنا لم يكن لديك C ++ كود في متناول اليد لإيقاف الخدمة، ولكن هنا هو رمز .NET. وهذا سوف يساعد نأمل أن جوجل المعلومات التي تحتاج إليها، أو العثور على مستندات في MSDN.

وهذا من بعض رمز اختبار جناح، وبالتالي فإن أسلوب التحقق من الخطأ؛) سوف تحتاج لوضع هذا الرمز في موضوع بحيث يحصل معالجة الرسالة الاغلاق

.
  private void stopPLService( bool close )
  {
     if ( m_serviceController == null )
     {
        m_serviceController = new ServiceController( "PLService" );
     }

     WriteLine( "StopPLService" );

     if ( m_serviceController != null )
     {
        try
        {
           m_serviceController.Stop();
        }
        catch
        {
           // Probably just means that it wasn't running or installed, ignore
        }

        // Wait up to 30 seconds for the service to stop
        try
        {
           m_serviceController.WaitForStatus( ServiceControllerStatus.Stopped, new TimeSpan( 0, 0, 30 ) );
        }
        catch ( System.ServiceProcess.TimeoutException )
        {
           Assert.Fail( "Timeout waiting for PLService to stop" );
        }
        catch
        {
           // Not installed, we only care in the start
        }
        if ( close )
        {
           m_serviceController.Close();
           m_serviceController = null;
        }
     }
  }

ربما تريد استخدام ControlService أو خدمة التحكمEx طرق لإيقاف الخدمة الخاصة بك.يجب أن تكون قادرًا على الحصول على المقبض المطلوب من CServiceModule.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top