青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

road420

導(dǎo)航

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

統(tǒng)計(jì)

常用鏈接

留言簿(2)

隨筆檔案

文章檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

如何“干凈地”終止 Win32 中的應(yīng)用程序

如何“干凈地”終止 Win32 中的應(yīng)用程序

編譯:Northtibet

  • 摘要
  • 32 位進(jìn)程(和 Windows 95 下的 16 位進(jìn)程)
  • 16 位問題(在 Windows NT 下)
  • 示例代碼
  • 摘要

      在理想環(huán)境中,某一進(jìn)程可能會(huì)通過某種形式的進(jìn)程間通信要求另一進(jìn)程關(guān)閉。不過,如果你對(duì)希望其關(guān)閉的應(yīng)用程序沒有源代碼級(jí)控制權(quán),可能就沒有辦法做這樣的選擇。盡管沒有哪種方法能保證“干凈地”關(guān)閉 Win32 中的應(yīng)用程序,但你可以采取一些步驟來確保應(yīng)用程序使用最佳方法清除資源。

    32 位進(jìn)程(和 Windows 95 下的 16 位進(jìn)程)

      在 Win32 下,操作系統(tǒng)可保證在進(jìn)程關(guān)閉時(shí)清除進(jìn)程所擁有的資源。但是,這并不意味著進(jìn)程本身將有機(jī)會(huì)對(duì)磁盤執(zhí)行任何最后的信息刷新或通過遠(yuǎn)程連接執(zhí)行任何最后的通信,也不意味著進(jìn)程的 DLL 將有機(jī)會(huì)執(zhí)行其 PROCESS_DETACH 代碼。這就是通常最好避免在 Windows 95 和 Windows NT 下終止應(yīng)用程序的原因。

    如果你必須關(guān)閉進(jìn)程,請(qǐng)按照下列步驟操作:

    1. 向你打算關(guān)閉的進(jìn)程所擁有的所有頂級(jí)窗口發(fā)送一條 WM_CLOSE 消息。許多 Windows 應(yīng)用程序會(huì)通過關(guān)閉它自身來響應(yīng)此消息。

      注意:控制臺(tái)應(yīng)用程序?qū)?WM_CLOSE 的響應(yīng)取決于它是否安裝了控制處理程序。

      使用 EnumWindows() 找到目標(biāo)窗口的句柄。在回調(diào)函數(shù)中,檢查該窗口的進(jìn)程 ID 是否與要關(guān)閉的進(jìn)程相匹配。你可以通過調(diào)用 GetWindowThreadProcessId() 來執(zhí)行此操作。確定匹配項(xiàng)后,使用 PostMessage() 或 SendMessageTimeout() 向該窗口發(fā)送 WM_CLOSE 消息。
    2. 使用 WaitForSingleObject() 等待進(jìn)程的句柄。確保你使用超時(shí)值等待,因?yàn)樵诤芏嗲闆r下 WM_CLOSE 不會(huì)關(guān)閉應(yīng)用程序。記住,應(yīng)使超時(shí)值足夠長(通過 WaitForSingleObject() 或 SendMessageTimeout()),以便用戶可以響應(yīng)為了 處理 WM_CLOSE 消息而創(chuàng)建的任何對(duì)話框。
    3. 如果返回值為 WAIT_OBJECT_0,則應(yīng)用程序已干凈地將其自身關(guān)閉。如果返回值為 WAIT_TIMEOUT,則必須使用 TerminateProcess() 關(guān)閉應(yīng)用程序。

      注意:如果從 WaitForSingleObject() 得到的返回值不是 WAIT_OBJECT_0 或 WAIT_TIMEOUT,則應(yīng)使用 GetLastError() 找出原因。
    通過執(zhí)行上述這些步驟,你便完全有可能干凈地關(guān)閉應(yīng)用程序(無需 IPC 或用戶干預(yù))。

    16 位問題(在 Windows NT 下)

      上述步驟適用于 Windows 95 下的 16 位應(yīng)用程序,而 Windows NT 下的 16 位應(yīng)用程序與 Windows 95 下的 16 位應(yīng)用程序的工作方式差別非常大。
      在 Windows NT 下,所有 16 位應(yīng)用程序都在虛擬 DOS 機(jī) (VDM) 中運(yùn)行。此 VDM 是作為 Windows NT 下的一個(gè) Win32 進(jìn)程 (NTVDM) 運(yùn)行的。NTVDM 進(jìn)程具有進(jìn)程 ID。你可以通過 OpenProcess() 獲取該進(jìn)程的句柄,就像處理其它任何 Win32 進(jìn)程一樣。不過,在 VDM 中運(yùn)行的 16 位應(yīng)用程序都沒有進(jìn)程 ID,因此你無法從 OpenProcess() 獲取進(jìn)程句柄。VDM 中的每個(gè) 16 位應(yīng)用程序都有一個(gè) 16 位任務(wù)句柄和一個(gè) 32 位執(zhí)行線程。可通過調(diào)用函數(shù) VDMEnumTaskWOWEx() 找到該任務(wù)句柄和線程 ID。有關(guān)這方面的其它信息,請(qǐng)參見:“如何用 Win32 APIs 枚舉應(yīng)用程序窗口和進(jìn)程”。
      關(guān)閉 Windows NT 下的 16 位應(yīng)用程序的首選和最直接的方法是關(guān)閉整個(gè) NTVDM 進(jìn)程。你可以通過執(zhí)行前面所描述的步驟來完成此操作。你只需知道 NTVDM 的進(jìn)程 ID 即可,參考“如何用 Win32 APIs 枚舉應(yīng)用程序窗口和進(jìn)程”所講的方法來查找 NTVDM 的進(jìn)程 ID。此方法的缺點(diǎn)是它會(huì)關(guān)閉在該 VDM 中運(yùn)行的所有 16 位應(yīng)用程序。如果這不是你想要的結(jié)果,則需要采取其它方法。
      如果你希望關(guān)閉 NTVDM 進(jìn)程中的單個(gè) 16 位應(yīng)用程序,需要按照下列步驟操作:
    1. 向該進(jìn)程所擁有的以及與你要關(guān)閉的 16 位任務(wù)具有相同線程 ID 的所有頂級(jí)窗口發(fā)送一條 WM_CLOSE 消息。執(zhí)行此操作最有效的方法是使用 EnumWindows()。在回調(diào)函數(shù)中,檢查窗口的進(jìn)程 ID 和線程 ID 是否與要關(guān)閉的 16 位任務(wù)相匹配。請(qǐng)記住,該進(jìn)程 ID 將成為在其中運(yùn)行 16 位應(yīng)用程序的 NTVDM 的進(jìn)程 ID。
    2. 盡管你有線程 ID,但無法等待 16 位進(jìn)程的終止。因此,你必須等待任意時(shí)間長度(以允許干凈關(guān)閉),然后嘗試關(guān)閉應(yīng)用程序。如果應(yīng)用程序已關(guān)閉,則此操作無效。如果應(yīng)用程序尚未關(guān)閉,則它將終止應(yīng)用程序。
    3. 使用稱為 VDMTerminateTaskWOW() 的函數(shù)終止應(yīng)用程序,該函數(shù)可在 Vdmdbg.dll 中找到。它采用 VDM 的進(jìn)程 ID 和 16 位任務(wù)的任務(wù)編號(hào)。

      此方法允許你關(guān)閉 Windows NT 下 VDM 中的單個(gè) 16 位應(yīng)用程序。不過,16 位 Windows 以及 VDM 中運(yùn)行的 WOWExec 都不能有效地清除已終止任務(wù)的資源。如果你要尋找最有可能干凈地終止 Windows NT 下的 16 位應(yīng)用程序的方法,應(yīng)考慮終止整個(gè) VDM 進(jìn)程。注意:如果你要啟動(dòng)以后可能會(huì)終止的 16 位應(yīng)用程序,請(qǐng)將 CREATE_SEPARATE_WOW_VDM 與 CreateProcess() 結(jié)合使用。

    示例代碼

      下面的示例代碼使用以下兩個(gè)函數(shù)實(shí)現(xiàn)上述用于 16 位和 32 位應(yīng)用程序的方法:TerminateApp() 和 Terminate16App()。TerminateApp() 采用一個(gè) 32 位進(jìn)程 ID 和一個(gè)超時(shí)值(以毫秒為單位)。Terminate16App()。這兩個(gè)函數(shù)都使用 DLL 函數(shù)的顯式鏈接,以便它們的二進(jìn)制文件與 Windows NT 和 Windows 95 都兼容。

       //******************

    // 頭文件 TermApp.h

    //******************

    #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 );



    //*********************

    // 實(shí)現(xiàn)代碼 TermApp.cpp

    //*********************

    #include "TermApp.h"

    #include <vdmdbg.h>

    typedef struct

    {

    DWORD dwID ;

    DWORD dwThread ;

    } TERMINFO ;

    // 聲明回調(diào)枚舉函數(shù).

    BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) ;

    BOOL CALLBACK Terminate16AppEnum( HWND hwnd, LPARAM lParam ) ;

    /*----------------------------------------------------------------

    DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout )

    功能:

    關(guān)閉 32-位進(jìn)程(或 Windows 95 下的 16-位進(jìn)程)

    參數(shù):

    dwPID

    要關(guān)閉之進(jìn)程的進(jìn)程 ID.

    dwTimeout

    進(jìn)程關(guān)閉前等待的毫秒時(shí)間.

    返回值:

    TA_FAILED —— 如果關(guān)閉失敗.

    TA_SUCCESS_CLEAN —— 如果使用 WM_CLOSE 關(guān)閉了進(jìn)程.

    TA_SUCCESS_KILL —— 如果使用 TerminateProcess() 關(guān)閉了進(jìn)程.

    返回值的定義參見頭文件.

    ----------------------------------------------------------------*/

    DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout )

    {

    HANDLE hProc ;

    DWORD dwRet ;

    // 如果無法用 PROCESS_TERMINATE 權(quán)限打開進(jìn)程,那么立即放棄。

    hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,dwPID);

    if(hProc == NULL)

    {
    return TA_FAILED ;
    }


    // TerminateAppEnum() 將 WM_CLOSE 消息發(fā)到所有其進(jìn)程ID 與你所提供的進(jìn)程ID 匹配的窗口.

    EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID) ;


    // 等待處理,如果成功,OK。如果超時(shí),則干掉它.

    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 )

    功能:

    關(guān)閉 Win16 應(yīng)用程序.

    參數(shù):

    dwPID

    16-位程序運(yùn)行其中的 NTVDM 進(jìn)程 ID.

    dwThread

    16-位程序中執(zhí)行線程的線程 ID.

    w16Task

    應(yīng)用程序的 16-位任務(wù)句柄.

    dwTimeout

    任務(wù)關(guān)閉前等待的毫秒時(shí)間.



    返回值:

    如果成功, 返回 TA_SUCCESS_16

    如果不成功, 返回 TA_FAILED.

    返回值的定義參見該函數(shù)的頭文件.

    注意:

    你可以通過 VDMEnumTaskWOW() 或 VDMEnumTaskWOWEx() 函數(shù)獲得 Win16 和線程 ID.

    ----------------------------------------------------------------*/

    DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,

    WORD w16Task, DWORD dwTimeout )

    {

    HINSTANCE hInstLib ;

    TERMINFO info ;

    // 你必須通過外部鏈接調(diào)用函數(shù),以便代碼在所有 Win32 平臺(tái)上都兼容。

    BOOL (WINAPI *lpfVDMTerminateTaskWOW)(DWORD dwProcessId,WORD htask) ;

    hInstLib = LoadLibraryA( "VDMDBG.DLL" ) ;

    if( hInstLib == NULL )
    return TA_FAILED ;

    // 獲得函數(shù)過程地址.

    lpfVDMTerminateTaskWOW = (BOOL (WINAPI *)(DWORD, WORD ))

    GetProcAddress( hInstLib, "VDMTerminateTaskWOW" ) ;

    if( lpfVDMTerminateTaskWOW == NULL )

    {

    FreeLibrary( hInstLib ) ;

    return TA_FAILED ;

    }

    // 向所有匹配進(jìn)程 ID 和線程的窗口發(fā)送 WM_CLOSE 消息.

    info.dwID = dwPID ;

    info.dwThread = dwThread ;

    EnumWindows((WNDENUMPROC)Terminate16AppEnum, (LPARAM) &info) ;

    // 等待.

    Sleep( dwTimeout ) ;

    // 然后終止.

    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 ;

    }

    posted on 2008-09-22 18:33 深邃者 閱讀(228) 評(píng)論(0)  編輯 收藏 引用


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
    網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


    青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩中文字幕综合视频 | 亚洲国产欧美不卡在线观看| 欧美亚洲成人精品| 欧美精品免费观看二区| 欧美—级在线免费片| 欧美成人激情视频| 欧美日韩综合精品| 国产欧美丝祙| 亚洲国产专区校园欧美| 免费看的黄色欧美网站| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美激情中文字幕乱码免费| 欧美日韩中文另类| 狠狠色综合网| 日韩午夜av在线| 欧美一区二区三区日韩视频| 欧美岛国激情| 亚洲综合日韩中文字幕v在线| 久久久亚洲成人| 欧美午夜性色大片在线观看| 黄色成人精品网站| 亚洲一区二区三区在线看| 久久五月婷婷丁香社区| 夜夜精品视频一区二区| 欧美一级欧美一级在线播放| 欧美成人一二三| 国产欧美日本在线| 在线性视频日韩欧美| 男女激情视频一区| 亚洲视频在线视频| 欧美精品一卡| 在线成人小视频| 欧美怡红院视频一区二区三区| 欧美激情第8页| 欧美一区二区三区视频| 欧美日韩国产高清视频| 亚洲国产另类久久精品| 久久精品视频免费| 一区二区三区免费在线观看| 老牛影视一区二区三区| 国内精品久久久久久久影视麻豆| 一区二区三区欧美在线观看| 欧美风情在线观看| 久久精品成人欧美大片古装| 国产欧美日韩视频一区二区| 一区二区冒白浆视频| 亚洲高清中文字幕| 久久久.com| 国产性色一区二区| 午夜久久美女| 亚洲综合另类| 国产欧美日韩精品专区| 午夜亚洲福利| 亚洲欧美日韩久久精品| 国产精品久久午夜| 亚洲一区欧美激情| 亚洲视频播放| 国产精品成人免费精品自在线观看| 亚洲精品日本| 亚洲日本欧美| 欧美激情欧美激情在线五月| 91久久中文| 亚洲精品一级| 欧美久久久久久久久| 一本色道久久加勒比精品| 亚洲精品一区中文| 欧美视频日韩视频| 亚洲一区精品在线| 亚洲欧美区自拍先锋| 欧美在线精品一区| 国产一区二区三区的电影| 久久久国产精品一区| 久久精品国产69国产精品亚洲| 一区二区三区在线观看视频| 老司机午夜精品视频在线观看| 久久精品国产第一区二区三区最新章节 | 久久综合99re88久久爱| 1024国产精品| 亚洲国产一成人久久精品| 欧美精品18+| 亚洲影院色在线观看免费| 夜夜狂射影院欧美极品| 国产日本欧洲亚洲| 欧美77777| 欧美日韩小视频| 香蕉久久夜色| 美女诱惑一区| 亚洲欧美中文字幕| 久久久久99精品国产片| 日韩一区二区精品| 亚洲尤物精选| 亚洲高清二区| 中日韩在线视频| 激情另类综合| 洋洋av久久久久久久一区| 国产免费成人在线视频| 亚洲二区在线| 国产精品永久免费在线| 亚洲国产精品成人精品| 国产精品一区免费在线观看| 久久亚洲捆绑美女| 欧美高清在线观看| 欧美系列亚洲系列| 欧美jizzhd精品欧美喷水| 欧美午夜激情在线| 欧美福利网址| 国产一区白浆| 亚洲深爱激情| 亚洲精品久久久久久一区二区 | 亚洲欧美国产精品va在线观看| ●精品国产综合乱码久久久久| 一区二区三区高清在线观看| 亚洲国产高清在线观看视频| 亚洲综合999| 亚洲视频一二三| 美日韩精品视频免费看| 久久精品国产999大香线蕉| 欧美日本一区| 欧美xart系列高清| 国产综合婷婷| 午夜久久美女| 亚洲一级片在线看| 欧美高清在线| 欧美国产视频一区二区| 国产在线一区二区三区四区| 亚洲主播在线观看| 亚洲欧美国产视频| 亚洲精品在线视频观看| 136国产福利精品导航| 性伦欧美刺激片在线观看| 香蕉免费一区二区三区在线观看 | 亚洲午夜精品网| 亚洲一区国产视频| 欧美性片在线观看| 亚洲精品韩国| 国产精品99久久不卡二区| 欧美黄色免费| 亚洲另类视频| 亚洲一区在线直播| 欧美体内谢she精2性欧美 | 亚洲精选91| 中文精品99久久国产香蕉| 欧美国产精品一区| 亚洲日本欧美在线| 亚洲午夜久久久| 国产精品a级| 亚洲综合不卡| 久久综合中文| 亚洲美女色禁图| 欧美精品一区二区三区久久久竹菊 | 国产精品永久入口久久久| 亚洲欧美日韩精品久久久久| 久久久91精品国产一区二区三区 | 一区二区欧美在线| 欧美日韩视频在线观看一区二区三区 | 亚洲一区二区三区在线| 国产精品久久久久久一区二区三区| 中日韩高清电影网| 久久精品中文字幕一区| 一区二区三区自拍| 欧美国产另类| 亚洲欧美精品在线观看| 免费视频亚洲| 亚洲一区二区三区777| 国产美女搞久久| 久久久爽爽爽美女图片| 亚洲黑丝在线| 久久本道综合色狠狠五月| 影音先锋成人资源站| 猛男gaygay欧美视频| 亚洲视频电影图片偷拍一区| 欧美成人性网| 午夜欧美大片免费观看| 亚洲人成啪啪网站| 国产精品羞羞答答xxdd| 久久综合久久综合久久综合| 日韩一区二区久久| 久久综合久色欧美综合狠狠 | 国产精品成人观看视频国产奇米| 欧美亚洲日本网站| 亚洲尤物在线| 欧美国内亚洲| 欧美一区二区性| 亚洲乱码久久| 欧美本精品男人aⅴ天堂| 一区二区欧美激情| 亚洲福利av| 国产一区二区三区不卡在线观看| 欧美精品久久99久久在免费线| 亚洲欧美精品suv| 99国产精品自拍| 欧美激情在线播放| 久久久久久久精| 欧美在线免费观看亚洲| 在线一区亚洲| 亚洲精品国产品国语在线app| 国产一区99| 国产精品视频九色porn| 欧美天堂亚洲电影院在线播放| 欧美精品一卡|