Làm th? nào đ? ch?m d?t m?t ?ng d?ng "S?ch" trong Win32

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 178893 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Trong m?t th? gi?i hoàn h?o, quá tr?nh c?a b?n có th? yêu c?u m?t ti?n tr?nh khác, thông qua m?t s? h?nh th?c giao ti?p inter-process, t?t. Tuy nhiên, n?u b?n không có ngu?n c?p quy?n ki?m soát c?a ?ng d?ng mà b?n mu?n t?t, sau đó, b?n có th? không có tùy ch?n này. M?c dù có không có b?o đ?m "s?ch" cách đ? t?t ?ng d?ng trong Win32, có nh?ng bư?c mà b?n có th? m?t đ? đ?m b?o r?ng các ?ng d?ng s? d?ng các phương pháp t?t nh?t đ? làm s?ch tài nguyên.

THÔNG TIN THÊM

Quá tr?nh 32-bit (và các quá tr?nh 16-Bit dư?i Windows 95)

Dư?i Win32, h? đi?u hành h?a h?n đ? làm s?ch các ngu?n tài nguyên thu?c s? h?u c?a m?t quá tr?nh khi nó t?t. Có đi?u này, tuy nhiên, ngh?a là quá tr?nh riêng c?a m?nh đ? có cơ h?i đ? làm b?t k? flushes cu?i cùng c?a thông tin đ? đ?a, b?t k? giao ti?p chung k?t qua m?t k?t n?i t? xa, và c?ng không có ngh?a là mà trong quá tr?nh c?a DLL s? có cơ h?i đ? th?c hi?n c?a h? PROCESS_DETACH m?. Đây là l? do t?i sao nó là nói chung thích h?p hơn đ? tránh ch?m d?t m?t ?ng d?ng theo Windows 95 và Windows NT.

N?u b?n hoàn toàn ph?i t?t m?t quá tr?nh, h?y làm theo các bư?c sau:
  1. Đăng m?t WM_CLOSE cho t?t c? các c?p cao nh?t windows thu?c s? h?u c?a quá tr?nh mà b?n mu?n t?t. Nhi?u c?a s? ?ng d?ng ph?n ?ng thư này b?ng cách t?t.

    LƯU ?: Ph?n ?ng m?t ?ng d?ng giao di?n đi?u khi?n đ? WM_CLOSE ph? thu?c vào vi?c có hay không nó đ? cài đ?t m?t b? x? l? đi?u khi?n.

    S? d?ng EnumWindows() đ? t?m các ch?t đ? windows m?c tiêu c?a b?n. Trong ch?c năng g?i l?i c?a b?n, ki?m tra xem n?u các c?a s? x? l? ID phù h?p v?i quá tr?nh b?n mu?n t?t. B?n có th? làm đi?u này b?ng cách g?i GetWindowThreadProcessId(). M?t khi b?n đ? thi?t l?p m?t tr?n đ?u, s? d?ng PostMessage() ho?c SendMessageTimeout() đ? g?i tin nh?n WM_CLOSE đ?n c?a s?.
  2. S? d?ng WaitForSingleObject() đ? ch? cho x? l? c?a quá tr?nh. H?y ch?c ch?n r?ng b?n ch? đ?i v?i m?t giá tr? timeout, b?i v? có r?t nhi?u t?nh hu?ng mà trong đó WM_CLOSE s? không t?t ?ng d?ng. H?y nh? đ? làm cho th?i gian ch? dài đ? (ho?c v?i WaitForSingleObject(), ho?c v?i SendMessageTimeout()) v? v?y mà ngư?i dùng có th? đáp ?ng v?i b?t k? h?p tho?i h?p mà đư?c t?o ra đ? đáp ?ng v?i WM_CLOSE thư.
  3. N?u giá tr? tr? l?i là WAIT_OBJECT_0, sau đó đóng ?ng d?ng c?a chính nó s?ch. N?u giá tr? tr? l?i là WAIT_TIMEOUT, sau đó b?n ph?i s? d?ng TerminateProcess() đ? t?t ?ng d?ng.

    LƯU ?: N?u b?n getting3 m?t tr? v? giá tr? t? WaitForSingleObject() khác sau đó WAIT_OBJECT_0 ho?c WAIT_TIMEOUT, s? d?ng GetLastError() đ? xác đ?nh nguyên nhân.
B?ng cách làm theo các bư?c này, b?n cung c?p cho các ?ng d?ng t?t nh?t có th? có mưa đ? t?t máy s?ch (ngoài IPC ho?c ngư?i dùng can thi?p).

V?n đ? 16-Bit (dư?i Windows NT)

Các bư?c trư?c làm vi?c cho các ?ng d?ng 16-bit dư?i Windows 95, tuy nhiên, ?ng d?ng Windows NT 16-bit làm vi?c r?t khác nhau.

Dư?i Windows NT, t?t c? các ?ng d?ng 16-bit ch?y trong máy DOS ?o (VDM). This VDM ch?y như là m?t quá tr?nh Win32 (NTVDM) theo Windows NT. NTVDM quá tr?nh này có m?t quá tr?nh c?a b?n. B?n có th? có đư?c m?t x? l? đ? x? l? thông qua OpenProcess(), gi?ng như b?n có th? v?i b?t k? quá tr?nh Win32 khác. Tuy nhiên, không có ?ng d?ng 16-bit đang ch?y trong VDM có m?t quá tr?nh ID, và do đó b?n không th? có đư?c m?t quá tr?nh x? l? t? OpenProcess(). M?i ?ng d?ng 16-bit trong m?t VDM đ? m?t 16-bit x? l? tác v? và m?t ch? đ? 32-bit th?c hi?n. ID x? l? và ch? đ? có th? đư?c t?m th?y thông qua m?t cu?c g?i đ?n ch?c năng VDMEnumTaskWOWEx(). Cho thêm thông tin, xin vui l?ng xem các bài vi?t sau đây trong ki?n th?c Microsoft Cơ s?:
175030Làm th? nào đ? li?t kê các ?ng d?ng trong Win32
C?a b?n l?a ch?n đ?u tiên, và đơn gi?n nh?t, khi t?t m?t 16-bit ?ng d?ng theo Windows NT là t?t toàn b? quá tr?nh NTVDM. B?n có th? làm đi?u này b?ng cách làm theo các bư?c đư?c nêu ? trên. B?n ch? c?n bi?t ID quá tr?nh c?a quá tr?nh NTVDM (xem bài vi?t KB 175030 trích d?n ? trên đ? t?m quá tr?nh ID c?a m?t NTVDM). Như?c đi?m c?a cách ti?p c?n này là nó đóng t?t c? các ?ng d?ng 16-bit đang ch?y trong đó VDM. N?u đi?u này là không m?c tiêu c?a b?n, sau đó b?n c?n ph?i th?c hi?n m?t cách ti?p c?n.

N?u b?n mu?n t?t m?t ?ng d?ng 16-bit duy nh?t trong m?t NTVDM quá tr?nh, sau đây là các bư?c b?n c?n ph?i th?c hi?n:
  1. Đăng m?t WM_CLOSE cho t?t c? các c?p cao nh?t windows mà đư?c s? h?u b?i quá tr?nh, và đó có cùng m?t owning thread ID như là nhi?m v? 16-bit b?n mu?n D?ng l?i. Cách hi?u qu? nh?t đ? làm đi?u này là b?ng cách s? d?ng EnumWindows(). Trong ch?c năng g?i l?i c?a b?n, ki?m tra xem n?u c?a s? x? l? ID và Thread ID phù h?p v?i nhi?m v? 16-bit b?n mu?n t?t. H?y nh? r?ng ID quá tr?nh s? là quá tr?nh ID c?a quá tr?nh NTVDM trong ?ng d?ng 16-bit ch?y.
  2. M?c dù b?n có m?t ID thread, b?n không có cách nào đ? ch? đ?i các ch?m d?t quá tr?nh 16-bit. Do đó, b?n ph?i đ?i cho m?t tùy ? th?i gian (đ? cho phép m?t s?ch đóng xu?ng), và sau đó c? g?ng t?t ?ng d?ng anyway. N?u ?ng d?ng đ? đóng xu?ng, sau đó đi?u này s? làm g?. N?u nó đ? không t?t, sau đó nó s? ch?m d?t các ?ng d?ng.
  3. Ch?m d?t các ?ng d?ng b?ng cách s? d?ng m?t ch?c năng g?i là VDMTerminateTaskWOW(), mà có th? đư?c t?m th?y trong Vdmdbg.dll. Ph?i m?t quá tr?nh ID c?a VDM và nhi?m v? s? lư?ng đ?c nhi?m 16-bit.
Cách ti?p c?n này cho phép b?n t?t m?t ?ng d?ng 16-bit duy nh?t trong v?ng m?t VDM dư?i Windows NT. Tuy nhiên, 16-bit c?a s? không ph?i là r?t t?t lúc làm s?ch tài nguyên c?a m?t công vi?c ch?m d?t, và không ph?i là WOWExec ch?y VDM. N?u b?n đang t?m ki?m các phương pháp có th? s?ch đ? ch?m d?t m?t ?ng d?ng 16-bit dư?i Windows NT, b?n nên xem xét ch?m d?t toàn b? quá tr?nh VDM. Lưu ?: N?u b?n đang b?t đ?u m?t 16-bit ?ng d?ng mà b?n có th? ch?m d?t sau này, sau đó s? d?ng các CREATE_SEPARATE_WOW_VDM v?i CreateProcess().

M?u m?

M?u m? th?c hi?n các k? thu?t mô t? ? trên cho 16-bit và 32- chút ?ng d?ng b?ng cách s? d?ng hai ch?c năng sau đây: TerminateApp() và Terminate16App(). TerminateApp() m?t m?t ID quá tr?nh 32-bit và m?t th?i gian ch? (trong miliseconds). Terminate16App(). C? hai ch?c năng s? d?ng liên k?t r? ràng đ? DLL ch?c năng do đó h? s? là tương thích nh? phân trên Windows NT và Windows 95.
   //******************
   //Header
   //******************

   #include <windows.h>

   #define TA_FAILED 0
   #define TA_SUCCESS_CLEAN 1
   #define TA_SUCCESS_KILL 2
   #define TA_SUCCESS_16 3

   DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout ) ;
   DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,
                        WORD w16Task, DWORD dwTimeout );

   //******************
   //Source
   //******************

   #include "TermApp.h"
   #include <vdmdbg.h>

   typedef struct
   {
      DWORD   dwID ;
      DWORD   dwThread ;
   } TERMINFO ;

   // Declare Callback Enum Functions.
   BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) ;

   BOOL CALLBACK Terminate16AppEnum( HWND hwnd, LPARAM lParam ) ;

   /*----------------------------------------------------------------
   DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout )

   Purpose:
      Shut down a 32-Bit Process (or 16-bit process under Windows 95)

   Parameters:
      dwPID
         Process ID of the process to shut down.

      dwTimeout
         Wait time in milliseconds before shutting down the process.

   Return Value:
      TA_FAILED - If the shutdown failed.
      TA_SUCCESS_CLEAN - If the process was shutdown using WM_CLOSE.
      TA_SUCCESS_KILL - if the process was shut down with
         TerminateProcess().
      NOTE:  See header for these defines.
   ----------------------------------------------------------------*/ 
   DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout )
   {
      HANDLE   hProc ;
      DWORD   dwRet ;

      // If we can't open the process with PROCESS_TERMINATE rights,
      // then we give up immediately.
      hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,
         dwPID);

      if(hProc == NULL)
      {
         return TA_FAILED ;
      }

      // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
      // matches your process's.
      EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID) ;

      // Wait on the handle. If it signals, great. If it times out,
      // then you kill it.
      if(WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0)
         dwRet=(TerminateProcess(hProc,0)?TA_SUCCESS_KILL:TA_FAILED);
      else
         dwRet = TA_SUCCESS_CLEAN ;

      CloseHandle(hProc) ;

      return dwRet ;
   }

   /*----------------------------------------------------------------
   DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,
                        WORD w16Task, DWORD dwTimeout )

   Purpose:
      Shut down a Win16 APP.

   Parameters:
      dwPID
         Process ID of the NTVDM in which the 16-bit application is
         running.

      dwThread
         Thread ID of the thread of execution for the 16-bit
         application.

      w16Task
         16-bit task handle for the application.

      dwTimeout
         Wait time in milliseconds before shutting down the task.

   Return Value:
      If successful, returns TA_SUCCESS_16
      If unsuccessful, returns TA_FAILED.
      NOTE:  These values are defined in the header for this
      function.

   NOTE:
      You can get the Win16 task and thread ID through the
      VDMEnumTaskWOW() or the VDMEnumTaskWOWEx() functions.
   ----------------------------------------------------------------*/ 
   DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,
                        WORD w16Task, DWORD dwTimeout )
   {
      HINSTANCE      hInstLib ;
      TERMINFO      info ;

      // You will be calling the functions through explicit linking
      // so that this code will be binary compatible across
      // Win32 platforms.
      BOOL (WINAPI *lpfVDMTerminateTaskWOW)(DWORD dwProcessId,
         WORD htask) ;

      hInstLib = LoadLibraryA( "VDMDBG.DLL" ) ;
      if( hInstLib == NULL )
         return TA_FAILED ;

      // Get procedure addresses.
      lpfVDMTerminateTaskWOW = (BOOL (WINAPI *)(DWORD, WORD ))
         GetProcAddress( hInstLib, "VDMTerminateTaskWOW" ) ;

      if( lpfVDMTerminateTaskWOW == NULL )
      {
         FreeLibrary( hInstLib ) ;
         return TA_FAILED ;
      }

      // Post a WM_CLOSE to all windows that match the ID and the
      // thread.
      info.dwID = dwPID ;
      info.dwThread = dwThread ;
      EnumWindows((WNDENUMPROC)Terminate16AppEnum, (LPARAM) &info) ;

      // Wait.
      Sleep( dwTimeout ) ;

      // Then terminate.
      lpfVDMTerminateTaskWOW(dwPID, w16Task) ;

      FreeLibrary( hInstLib ) ;
      return TA_SUCCESS_16 ;
   }

   BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam )
   {
      DWORD dwID ;

      GetWindowThreadProcessId(hwnd, &dwID) ;

      if(dwID == (DWORD)lParam)
      {
         PostMessage(hwnd, WM_CLOSE, 0, 0) ;
      }

      return TRUE ;
   }

   BOOL CALLBACK Terminate16AppEnum( HWND hwnd, LPARAM lParam )
   {
      DWORD      dwID ;
      DWORD      dwThread ;
      TERMINFO   *termInfo ;

      termInfo = (TERMINFO *)lParam ;

      dwThread = GetWindowThreadProcessId(hwnd, &dwID) ;

      if(dwID == termInfo->dwID && termInfo->dwThread == dwThread )
      {
         PostMessage(hwnd, WM_CLOSE, 0, 0) ;
      }

      return TRUE ;
   }
				

Thu?c tính

ID c?a bài: 178893 - L?n xem xét sau cùng: 23 Tháng Chín 2011 - Xem xét l?i: 3.0
Áp d?ng
  • Microsoft Win32 Application Programming Interface
T? khóa: 
kbhowto kbkernbase kbthread kbmt KB178893 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:178893

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com