2012-01-06 6 views
5

बंद होने पर ग़लत अनुप्रयोग बंद हो गया है मेरे पास एक ऐसा एप्लिकेशन है जिसे मैं बंद कर देता हूं जब मैं बंद हो जाता हूं (या उपयोगकर्ता लॉग ऑफ करता है)। यह काम करने के लिए प्रयोग किया जाता था (एक्सपी में) लेकिन पिछले साल कभी-कभी किसी ने ध्यान दिए बिना तोड़ दिया। यह विंडोज 7 के तहत भी टूट गया है (लेकिन अलग-अलग)।विंडोज़

हमारे उत्पाद की एक मुख्य प्रक्रिया (server.exe) है जो कई अन्य प्रक्रियाओं को शुरू करती है। एक खूबसूरत शट डाउन में server.exe की सभी प्रक्रियाओं को पूछना होगा जो इसे बंद करना शुरू कर देते हैं। हालांकि, जब मैं इस कोड को डीबग करता हूं तो ऐसा लगता है कि अन्य प्रक्रियाओं को पहले से ही समाप्त कर दिया गया है। हमारी मुख्य प्रक्रिया (server.exe) एकमात्र प्रक्रिया है जो WM_QUERYENDSESSION और WM_ENDSESSION संदेशों को प्रबंधित कर रही है। नीचे दिए गए कोड (इस XP के अंतर्गत काम करता था, लेकिन किसी भी अधिक नहीं है):

LRESULT CALLBACK master_wnd_proc 
(
    HWND hwnd,  /* (in) handle to window */ 
    UINT uMsg,  /* (in) message identifier */ 
    WPARAM wParam, /* (in) first message parameter */ 
    LPARAM lParam /* (in) second message parameter */ 
) 
{ 
    LRESULT result; /* return value */ 
    long msg_code; 

    switch (uMsg) 
    { 
     case WM_ENDSESSION: 
     if (wParam) 
     { 
      msg_code = PCS_WINDOWS_SHUTDOWN; 
      if(lParam & 0x01L) 
       msg_code = WINDOWS_SHUT_CLOSE; 
      if(lParam & 0x40000000L) 
       msg_code = WINDOWS_SHUT_CRIT; 
      if((unsigned long)lParam & 0x80000000) 
       msg_code = WINDOWS_SHUT_LOGOFF; 
      MsgGenerate(msg_code, MSG_SEVERE, MSG_LOG, ""); 

      ipc_declare_shutdown(msg_code); 

      //We need one more message in the message queue 
      //to force the message loop, below, to exit. 
      PostQuitMessage(EXIT_SUCCESS); 

      /* WARNING: Don't call MsgGenerate() after this point! */ 
     } 
     result = 0; 
     break; 

     case WM_QUERYENDSESSION: 

     /* return TRUE to say "okay to shutdown" 
      * If FALSE is returned, then other processes are not stopped 
      * and the session isn't ended. 
      */ 
     result = TRUE; 
     break; 

     /* for a Windows TIMER or for an IPC prompt, handle 
     * the old server code and tcall messages and 
     * once-per-second work. Notice that the 
     * once-per-second work could just be done on the WM_TIMER 
     * and the tcall work could just be done on the WM_APP_IPC_POSTED 
     * but I've merged them together here. The merge isn't 
     * necessary to fix a bug or anything, but rather to 
     * make the code more robust in the face of unexpected 
     * conditions. 
     */ 
     case WM_TIMER: 
     case WM_APP_IPC_POSTED: 
     /* now handle tcall messages */ 
     (void) server(); 

     result = FALSE; 
     break; 

     default: 
     result = DefWindowProc (hwnd, uMsg, wParam, lParam); 
     break; 
    } 

    return result; 
} 

यह है जैसे कि हम पिछले साल कुछ बदल दिया है WM_QUERYENDSESSION संदेश को संभालने के लिए सभी चाइल्ड प्रक्रियाओं की आवश्यकता होगी (लगता है मैं वास्तव में इससे बचना चाहूंगा)। मुझे कोई संदेश नहीं मिल रहा है कि प्रक्रियाएं कब होती हैं या यह संदेश नहीं मिलता है।

मैंने इसे नई एपीआई का उपयोग करके विंडोज 7 के तहत काम किया है, लेकिन यह पता लगाना होगा कि यह XP के तहत क्यों टूट गया है, इसलिए मेरे पास एक समाधान हो सकता है जो ओएस दोनों के लिए काम करता है।

कोई मदद?

+1

क्या यह हो सकता है कि विंडोज किसी कारण से अलग-अलग क्रम में प्रक्रियाओं को बंद कर रहा है? वहां क्या गारंटी है कि आपकी 'server.exe' पहली चीज है जो विंडोज बंद हो जाती है? –

+0

क्या आपके पास स्रोत नियंत्रण में कोड का थोड़ा सा संभावना है? आप कम से कम देख सकते हैं कि पिछले साल में क्या बदला गया है? –

+0

यह सुनिश्चित नहीं है कि सर्वर से पहले क्या हो रहा है। EXE शटडाउन ... –

उत्तर

3

विस्टा समय के आसपास चीजें बदल गईं, यह सुनिश्चित नहीं है कि इससे आपके कोड को कैसे प्रभावित किया जाएगा। सबसे अच्छा काम यह है कि शट डाउन ऑर्डर निर्धारित करने के लिए इसे विंडोज़ तक नहीं छोड़ना है। हेल्पर प्रक्रियाओं से पहले अपने सर्वर को शट डाउन अधिसूचना प्राप्त करने के लिए कहें:

DWORD dwLevel, dwFlags; 
    BOOL fOkay = GetProcessShutdownParameters(&dwLevel, &dwFlags); 
    ASSERT(fOkay); 
    if (fOkay && dwLevel > 0x100) { 
     fOkay = SetProcessShutdownParameters(dwLevel + 1, SHUTDOWN_NORETRY); 
     ASSERT(fOkay); 
    } 
+0

यह लगभग काम करता है ... –

+0

XP के तहत यह बहुत अच्छा काम करता है। विंडोज 7 के तहत व्यवहार अभी भी वही है। –

+0

मुझे यह Win7 पर काम करता है। अनुमान लगाने में कठोर कुछ और आपको परेशान करता है। –