结束进程

本文介绍了一个用于终止32位及16位进程的API实现,包括发送关闭消息和强制结束进程的方法。提供了两个主要函数TerminateApp和Terminate16App的详细代码示例,解释了它们的功能、参数和返回值。
//头文件
#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);

//////////////////////////////////////////////////////////////////////////
//cpp源文件
#include <vdmdbg.h>
typedef struct
{
    DWORD dwID;
    DWORD dwThread;
}TERMINFO;

// 声明回调枚举函数.
BOOL CALLBACK TerminateAppEnum(HWND hwnd, LPARAM lParam);
BOOL CALLBACK Terminate16AppEnum(HWND hwnd, LPARAM lParam);

/*----------------------------------------------------------------
DWORD WINAPI TerminateApp(DWORD dwPID, DWORD dwTimeout)
功能: 关闭 32-位进程(或  Windows 95 下的 16-位进程)
参数:
    dwPID  要关闭之进程的进程 ID.
    dwTimeout  进程关闭前等待的毫秒时间.
返回值:
    TA_FAILED        关闭失败.
    TA_SUCCESS_CLEAN  如果使用 WM_CLOSE 关闭了进程.
    TA_SUCCESS_KILL 如果使用 TerminateProcess() 关闭了进程.
    返回值的定义参见头文件.
----------------------------------------------------------------*/
DWORD WINAPI TerminateApp(DWORD dwPID, DWORD dwTimeout)
{
    HANDLE hProc;
    // 如果无法用 PROCESS_TERMINATE 权限打开进程,那么立即放弃。
    hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,dwPID);
    if(hProc == NULL)
    {
        return TA_FAILED;
    }

    // TerminateAppEnum() 将 WM_CLOSE 消息发到所有其进程ID 与你所提供的进程ID 匹配的窗口.
    EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID);

    // 等待处理,如果成功,OK。如果超时,则干掉它.
    DWORD dwRet;
    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)
功能:
    关闭 Win16 应用程序.
参数:
    dwPID  16-位程序运行其中的 NTVDM 进程 ID.
    dwThread 16-位程序中执行线程的线程 ID.
    w16Task  应用程序的 16-位任务句柄.
    dwTimeout  任务关闭前等待的毫秒时间.
返回值:
    如果成功, 返回 TA_SUCCESS_16
    如果不成功, 返回 TA_FAILED. 
    返回值的定义参见该函数的头文件.
    注意:
    可以通过 VDMEnumTaskWOW() 或 VDMEnumTaskWOWEx() 函数获得 Win16 和线程 ID.
----------------------------------------------------------------*/
DWORD WINAPI Terminate16App(DWORD dwPID, DWORD dwThread,WORD w16Task, DWORD dwTimeout)
{
    //必须通过外部链接调用函数,以便代码在所有Win32 平台上都兼容。
    BOOL (WINAPI *lpfVDMTerminateTaskWOW)(DWORD dwProcessId,WORD htask);
    HINSTANCE hInstLib;
    hInstLib = LoadLibraryA("VDMDBG.DLL");
    if(hInstLib == NULL)
        return TA_FAILED;

    // 获得函数过程地址.
    lpfVDMTerminateTaskWOW = (BOOL(WINAPI*)(DWORD, WORD))GetProcAddress(hInstLib, "VDMTerminateTaskWOW");
    if(lpfVDMTerminateTaskWOW == NULL)
    {
        FreeLibrary(hInstLib);
        return TA_FAILED;
    }

    // 向所有匹配进程 ID 和线程的窗口发送 WM_CLOSE 消息.
    TERMINFO info;
    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;
}   

转载于:https://www.cnblogs.com/jkcx/p/7808293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值