Win32ÀÇ ¿ÏÀüÈ÷"ÀÀ¿ë ÇÁ·Î±×·¥ Á¾·á ¹æ¹ý

±â¼ú ÀÚ·á: 178893 - ÀÌ ¹®¼­°¡ Àû¿ëµÇ´Â Á¦Ç° º¸±â.
¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

ÀÌ ÆäÀÌÁö¿¡¼­

¿ä¾à

¿Ïº®ÇÑ ¼¼°è¿¡¼­ ÇÁ·Î¼¼½º¿¡ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ Á¾·áÇϵµ·Ï ÇÁ·Î¼¼½º°£ Åë½Å ÀϺΠÆûÀ» ÅëÇØ ¿äûÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ¿øÇÏ´Â Á¾·á ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¼Ò½º ¼öÁØÀÇ ÄÁÆ®·ÑÀÌ ÀÖ´Â °æ¿ì ´ÙÀ½ »ç¿ëÀÚ°¡ ÀÌ ¿É¼ÇÀÌ ¾øÀ» ¼ö ÀÖ½À´Ï´Ù. Win32¿¡¼­ ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÒ º¸ÀåµÈ "Ŭ¸°" ¹æ¹ýÀÌ ÀÖÁö¸¸ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ ¸®¼Ò½º¸¦ Á¤¸®ÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº »ç¿ëÇÏ´Â º¸ÀåÇϱâ À§ÇØ ÃëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.

Ãß°¡ Á¤º¸

32 ºñÆ® ÇÁ·Î¼¼½º ¹× Windows 95¿¡¼­ 16ºñÆ® ÇÁ·Î¼¼½º

Win32¿¡¼­ ¿î¿µ üÁ¦¸¦ Á¾·áÇÒ ¶§ ÇÁ·Î¼¼½º°¡ ¼ÒÀ¯ÇÑ ¸®¼Ò½º¸¦ Á¤¸®ÇÏ´Â µ¥ ¾à¼ÓÇÕ´Ï´Ù. ±×·¯³ª ÀÌ ÇÁ·Î¼¼½º ÀÚü¸¦ ¿ø°Ý ¿¬°áÀ» ÅëÇØ ÃÖÁ¾ Åë½Å µð½ºÅ©·Î Á¤º¸ÀÇ ¸ðµç ÃÖÁ¾ Ç÷¯½Ã ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ °¡Áø ¾ÊÀ¸¸ç ÇØ´ç ÇÁ·Î¼¼½ºÀÇ ÀǹÌÇմϱî ÀǹÌÇÏÁö´ÂÁö ¾Ê½À´Ï´Ù, DLLÀÇ PROCESS_DETACH Äڵ带 ½ÇÇàÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ °®°Ô µË´Ï´Ù. Windows 95 ¹× Windows NT¿¡¼­ ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÏ´Â ¹æÁöÇϱâ À§ÇØ »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀ¸·Î ÁÁ½À´Ï´Ù ÀÌÀ¯ÀÔ´Ï´Ù.

¹Ýµå½Ã ÇÁ·Î¼¼½º¸¦ Á¾·áÇØ¾ß ÇÕ´Ï´Ù °æ¿ì ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
  1. ¿øÇÏ´Â Á¾·á ÇÁ·Î¼¼½º°¡ ¼ÒÀ¯ÇÏ´Â ¸ðµç ÃÖ»óÀ§ â¿¡ ´ëÇÑ WM_CLOSE¸¦ °Ô½ÃÇϽʽÿÀ. ¸¹Àº Windows ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÏ´Â ÀÇÇØ ÀÌ ¸Þ½ÃÁö¿¡ ÀÀ´äÇÕ´Ï´Ù.

    Âü°í: WM_CLOSE ¼ö ÀÖ´Â ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÀÀ´ä Á¦¾î 󸮱Ⱑ ¼³Ä¡µÇ¾î ÀÖ´Â ¿©ºÎ¿¡ µû¶ó ´Þ¶óÁý´Ï´Ù.

    EnumWindows()¸¦ ´ë»ó â ÇÚµéÀ» ãÀ» ¼ö ÀÖ½À´Ï´Ù. Äݹé ÇÔ¼ö¸¦ È®ÀÎÇϰí ÇØ´ç âÀ» ÇÁ·Î¼¼½º ID Á¾·á ÇÁ·Î¼¼½º¸¦ ã½À´Ï´Ù. GetWindowThreadProcessId() È£ÃâÇÏ¿© ÀÌ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÏÄ¡ÇÏ´Â ¼³Á¤ÇÑ ÈÄ¿¡´Â PostMessage() ¶Ç´Â SendMessageTimeout() WM_CLOSE ¸Þ½ÃÁö âÀ» °Ô½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.
  2. WaitForSingleObject()¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµéÀ» ±â´Ù¸³´Ï´Ù. Àֱ⠶§¹®¿¡ ´ëºÎºÐÀÇ °æ¿ì ÇØ´ç WM_CLOSE ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¾·áµË´Ï´ÙÁö ¾Ê½À´Ï´Ù ½Ã°£ Ãʰú °ªÀ» ±â´Ù·Á¾ß ÇÕ´Ï´Ù. Á¦ÇÑ ½Ã°£ µ¿¾È¸¸ ÇÕ´Ï´Ù (»ç¿ëÀÚ°¡ ¸ðµç ´ëÈ­ ÀÀ´äÇÒ ¼ö ÀÖµµ·Ï ÇÔ²² ¶Ç´Â WaitForSingleObject(), SendMessageTimeout()) ÇÔ²² ÀÖ´Â »óÀÚ¸¦ WM_CLOSE ¸Þ½ÃÁö¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ¸¸µé¾ú½À´Ï´Ù.
  3. WAIT_OBJECT_0 ¹Ýȯ °ªÀÌ ¾ø´Â °æ¿ì ´ÙÀ½ ÀÀ¿ë ÇÁ·Î±×·¥ ÀÚü¿¡ ¿ÏÀüÈ÷ ´ÝÈù. ´ÙÀ½ ¹Ýȯ °ªÀÌ WAIT_TIMEOUT ÀÎ °æ¿ì, ÀÀ¿ë ÇÁ·Î±×·¥ Á¾·á TerminateProcess()¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

    Âü°í: getting3 ±âŸ WaitForSingleObject() ´ÙÀ½ WAIT_OBJECT_0 ¶Ç´Â WAIT_TIMEOUT¿¡¼­ ¹Ýȯ °ªÀÌ ÀÖ´Â °æ¿ì GetLastError() ¿øÀÎÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
´ÙÀ½ ÀÌ ´Ü°è¿¡ µû¶ó »ç¿ëÀÚ°¡ ÀÀ¿ë ÇÁ·Î±×·¥À» °¡´ÉÇÑ ÃÖ»óÀÇ ±âȸ¸¦ ¿ÏÀüÈ÷ (À̿ܿ¡´Â IPC ¶Ç´Â »ç¿ëÀÚ °³ÀÔ) Á¾·á ºÎ¿©ÇÕ´Ï´Ù.

Windows NTÀÇ 16ºñÆ® ¹®Á¦

±×·¯³ª ÀÛ¾÷ Windows 95¿¡¼­ 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇØ ¾ÕÀÇ ´Ü°è¸¦, Windows NT 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» ¸Å¿ì ´Ù¸£°Ô ÀÛµ¿ÇÕ´Ï´Ù.

Windows NT¿¡¼­ ¸ðµç 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥Àº °¡»ó DOS ½Ã½ºÅÛ (VDM) ¿¡¼­ ½ÇÇàµË´Ï´Ù. Windows NTÀÇ Win32 ÇÁ·Î¼¼½º (NTVDM)ÀÌ ÀÌ VDMÀÌ ½ÇÇàµË´Ï´Ù. NTVDM ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ID°¡ ÀÖ½À´Ï´Ù. ´Ù¸¥ Win32 ÇÁ·Î¼¼½º °æ¿ìó·³ OpenProcess() ÅëÇØ ÇÁ·Î¼¼½º ÇÚµéÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ±×·³¿¡µµ ºÒ±¸Çϰí VDM¿¡¼­ ½ÇÇà ÁßÀÎ 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» ÇÁ·Î¼¼½º ID¸¦ °¡Áø ¹× µû¶ó¼­ »ç¿ëÇϸé ÇÁ·Î¼¼½º ÇÚµé OpenProcess()¿¡¼­ °¡Á®¿Ã ¼ö ¾ø½À´Ï´Ù. °¢ 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ VDM¿¡ 16ºñÆ® ÀÛ¾÷ ó¸® ¹× 32 ºñÆ® ½º·¹µå ½ÇÇàÀÌ ÀÖ½À´Ï´Ù. ÇÚµé ¹× ½º·¹µå ID VDMEnumTaskWOWEx() ÇÔ¼ö È£ÃâÀ» ÅëÇØ ãÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
175030Win32 ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¿­°Å ¹æ¹ý
Windows NTÀÇ 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÏ´Â °æ¿ì »ç¿ëÀÚÀÇ Ã¹ ¹øÂ°, ¹× °¡Àå °£´ÜÇÑ ¿É¼ÇÀº Àüü NTVDM ÇÁ·Î¼¼½º¸¦ Á¾·áÇÒ ¼ö ÀÖ½À´Ï´Ù. À§¿¡¼­ ¼³¸íÇÑ ´Ü°è¸¦ ¼öÇàÇÏ¿© ÀÌ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. NTVDM ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ID¸¦ ¾Ë¾Æ¾ß ÇÒ À§¿¡¼­ ¾ð±ÞÇÑ ÀÖ´Â NTVDM ÇÁ·Î¼¼½º¸¦ ID¸¦ ãÀ» ¼ö ÀÖ´Â KB ¹®¼­ 175030 ÂüÁ¶ÇϽʽÿÀ. ÀÌ ¹æ¹ýÀÇ ´ÜÁ¡Àº ÇØ´ç VDM ½ÇÇà ÁßÀÎ ¸ðµç 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» ´Ý´Â °ÍÀÔ´Ï´Ù. ±×·± ´ÙÀ½ ÀÌ·¯ÇÑ ¸ñÇ¥¸¦ ¾Æ´Ï¸é ´Ù¸¥ Á¢±Ù ÇÕ´Ï´Ù.

´ÜÀÏ 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥ ³»¿¡¼­ NTVDM ÇÁ·Î¼¼½º Á¾·áÇÒ ¼ö ¿øÇÒ °æ¿ì ´ÙÀ½À» ¼öÇàÇØ¾ß ÇÒ ´Ü°è´Â ´ÙÀ½°ú °°½À´Ï´Ù.
  1. ¸ðµç ÃÖ»óÀ§ â¿¡ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ¼ÒÀ¯Çϰí Á¾·á 16 ºñÆ® ÀÛ¾÷ µ¿ÀÏÇÑ ¼ÒÀ¯ ½º·¹µå ID¸¦ °®°í ÀÖ´Â WM_CLOSE¸¦ °Ô½ÃÇϽʽÿÀ. ÀÌ·¸°Ô ÇÏ´Â °¡Àå È¿°úÀûÀÎ ¹æ¹ýÀº EnumWindows() »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. Äݹé ÇÔ¼ö¿¡ âÀÇ ÇÁ·Î¼¼½º ID¿Í ½º·¹µå ID¸¦ Á¾·á 16 ºñÆ® ÀÛ¾÷À» ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇϽʽÿÀ. 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â NTVDM ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ID¸¦ ¼ö ÀÖµµ·Ï ÇÁ·Î¼¼½º ID¸¦ À̵¿ÇÏ´Â ±â¾ïÇØ¾ß ÇÕ´Ï´Ù.
  2. ½º·¹µå ID¸¦ ÀÖÁö¸¸ 16ºñÆ® ÇÁ·Î¼¼½º Á¾·á¸¦ ±â´Ù¸®´Â ¹æ¹ýÀÌ ¾ø½À´Ï´Ù. °á°úÀûÀ¸·Î, ÀÓÀÇÀÇ ±æÀ̸¦ ½Ã°£ (Ŭ¸° Á¾·á Çã¿ë)À» À§ÇÑ ±â´Ù·È´Ù°¡ ±×·¡µµ ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÏ´Â µ¥ ½ÃµµÇϽʽÿÀ ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÀÌ¹Ì Á¾·áµÇ¾ú´ÂÁö ´ÙÀ½ ÀÌ ¾Æ¹« ÀÛ¾÷µµ ¼öÇàÇÕ´Ï´Ù. Á¾·áµÇÁö ¾ÊÀº ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù.
  3. ãÀ» ¼ö ÀÖ´Â Vdmdbg.dll VDMTerminateTaskWOW() ¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇϽʽÿÀ. ÇÁ·Î¼¼½º ID¸¦ »ç¿ëÇÏ¿© VDM ¹× 16 ºñÆ® ÀÛ¾÷ÀÇ ÀÛ¾÷ ¹øÈ£¸¦ »ç¿ëÇÕ´Ï´Ù.
ÀÌ ¹æ¹ýÀ» »ç¿ëÇϸé Windows NTÀÇ VDM ³»¿¡¼­ ´ÜÀÏ 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª 16ºñÆ® Windows ¸Å¿ì ÁÁÀº Á¾·áµÈ ÀÛ¾÷ÀÇ ¸®¼Ò½º¸¦ Á¤¸®ÇÏ´Â ½Ã ¾Æ´Ï°í µÑ ´Ù ÀÖ´Â VDM ½ÇÇàÇÏ´Â WOWExec. Windows NTÀÇ 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» Á¾·áÇÏ´Â µ¥ cleanest °¡´ÉÇÑ ¹æ¹ýÀ» ã´Â °æ¿ì Àüü VDM ÇÁ·Î¼¼½º¸¦ Á¾·áÇÏ¸é °í·ÁÇØ¾ß ÇÕ´Ï´Ù. Âü°í: ³ªÁß¿¡ Á¾·áÇÒ ¼ö ÀÖ´Â 16 ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÃÀÛÇÏ´Â °æ¿ì, ´ÙÀ½, CREATE_SEPARATE_WOW_VDMÀ» CreateProcess() ÇÔ²² »ç¿ëÇϽʽÿÀ.

¿¹Á¦ ÄÚµå

»ùÇà ÄÚµå´Â ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â 16ºñÆ® ¹× 32ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥Àº À§¿¡¼­ ¼³¸íÇÑ ±â¼úÀ» ±¸ÇöÇÏ´Â: TerminateApp() ¹× Terminate16App(). TerminateApp() (¹Ð¸®ÃÊ´Â ¿¡¼­) 32ºñÆ® ÇÁ·Î¼¼½º ID ¹× ½Ã°£ Á¦ÇÑÀ» »ç¿ëÇÕ´Ï´Ù. Terminate16App()ÀÔ´Ï´Ù. µÎ ÇÔ¼ö ¸ðµÎ ÀÌ·¯ÇÑ ÀÌÁø ȣȯ Windows NT ¹× Windows 95 °ÉÃÄ ¼ö ÀÖµµ·Ï DLL ÇÔ¼ö¿¡ ¸í½ÃÀû ¸µÅ©¸¦ »ç¿ëÇÕ´Ï´Ù.
   //******************
   //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 ;
   }
				

¼Ó¼º

±â¼ú ÀÚ·á: 178893 - ¸¶Áö¸· °ËÅä: 2004³â 7¿ù 13ÀÏ È­¿äÀÏ - ¼öÁ¤: 2.4
º» ¹®¼­ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
  • Microsoft Win32 Application Programming Interface?À»(¸¦) ´ÙÀ½°ú ÇÔ²² »ç¿ëÇßÀ» ¶§
    • Microsoft Windows 95
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Ű¿öµå:?
kbmt kbhowto kbkernbase kbthread KB178893 KbMtko
±â°è ¹ø¿ªµÈ ¹®¼­
Áß¿ä: º» ¹®¼­´Â Àü¹® ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ °ÍÀÌ ¾Æ´Ï¶ó Microsoft ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î·Î ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù. Microsoft´Â ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ ¹®¼­ ¹× ±â°è ¹ø¿ªµÈ ¹®¼­¸¦ ¸ðµÎ Á¦°øÇϹǷΠMicrosoft ±â¼ú ÀÚ·á¿¡ ÀÖ´Â ¸ðµç ¹®¼­¸¦ Çѱ۷ΠÁ¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ±â°è ¹ø¿ª ¹®¼­°¡ Ç×»ó ¿Ïº®ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. µû¶ó¼­ ±â°è ¹ø¿ª ¹®¼­¿¡´Â ¸¶Ä¡ ¿Ü±¹ÀÎÀÌ Çѱ¹¾î·Î ¸»ÇÒ ¶§ ½Ç¼ö¸¦ ÇÏ´Â °Íó·³ ¾îÈÖ, ±¸¹® ¶Ç´Â ¹®¹ý¿¡ ¿À·ù°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. Microsoft´Â ³»¿ë»óÀÇ ¿À¿ª ¶Ç´Â Microsoft °í°´ÀÌ ÀÌ·¯ÇÑ ¿À¿ªÀ» »ç¿ëÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â ºÎ Á¤È®¼º, ¿À·ù ¶Ç´Â ¼ÕÇØ¿¡ ´ëÇØ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Microsoft´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÚÁÖ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ½À´Ï´Ù.

Çǵå¹é º¸³»±â