Windows编程: 进程与线程的创建与关闭

134 阅读2分钟

创建进程API,用于启动应用程序

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    // 初始化结构
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // 创建新进程
    if (CreateProcess(
        "C:\\Path\\To\\YourExecutable.exe", // 可执行文件路径
        NULL, // 命令行参数
        NULL, // 进程安全属性
        NULL, // 线程安全属性
        FALSE, // 不继承句柄
        0, // 默认创建标志
        NULL, // 使用调用进程的环境
        NULL, // 使用调用进程的当前目录
        &si, // 启动信息
        &pi) // 进程信息
    ) {
        // 等待进程完成
        WaitForSingleObject(pi.hProcess, INFINITE);

        // 关闭句柄
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    } else {
        printf("CreateProcess failed (%d).\n", GetLastError());
    }

关闭进程

    // 获取目标进程的 PID(假设我们已知 PID)
    DWORD processId = 1234; // 替换为实际进程 ID
    HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processId);

    if (hProcess != NULL) {
        // 终止进程
        if (TerminateProcess(hProcess, 0)) {
            printf("Process terminated successfully.\n");
        } else {
            printf("Failed to terminate process (%d).\n", GetLastError());
        }

        // 关闭句柄
        CloseHandle(hProcess);
    } else {
        printf("Failed to open process (%d).\n", GetLastError());
    }

通过进程快照来进行进程关闭

    // 创建进程快照
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_PROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) {
        printf("Failed to create process snapshot (%d).\n", GetLastError());
        return;
    }

    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(pe);

    // 遍历进程快照
    if (Process32First(hSnapshot, &pe)) {
        do {
            // 比较进程名
            if (strcmp(pe.szExeFile, processName) == 0) {
                // 打开进程
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
                if (hProcess != NULL) {
                    // 终止进程
                    if (TerminateProcess(hProcess, 0)) {
                        printf("Terminated process: %s (PID: %u)\n", pe.szExeFile, pe.th32ProcessID);
                    } else {
                        printf("Failed to terminate process (%d).\n", GetLastError());
                    }
                    CloseHandle(hProcess);
                } else {
                    printf("Failed to open process (%d).\n", GetLastError());
                }
            }
        } while (Process32Next(hSnapshot, &pe));
    } else {
        printf("Failed to get first process (%d).\n", GetLastError());
    }

    // 关闭快照句柄
    CloseHandle(hSnapshot);

创建线程(windos的进程保护,线程创建的都是在当前进程下)

    int number = 42;
    HANDLE hThread;
    DWORD threadId;

    hThread = CreateThread(
        NULL,                // 默认安全属性
        0,                   // 默认堆栈大小
        ThreadFunction,      // 线程函数
        &number,            // 参数传递
        0,                   // 默认创建标志
        &threadId           // 线程 ID
    );

    if (hThread != NULL) {
        // 等待线程完成
        WaitForSingleObject(hThread, INFINITE);
        
        // 关闭线程句柄
        CloseHandle(hThread);
    } else {
        printf("CreateThread failed (%d).\n", GetLastError());
    }

根据指定进程,关闭指定线程(通过线程快照遍历线程).

 // 创建线程快照
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) {
        printf("Failed to create thread snapshot (%d).\n", GetLastError());
        return;
    }

    THREADENTRY32 te;
    te.dwSize = sizeof(te);

    // 遍历线程快照
    if (Thread32First(hSnapshot, &te)) {
        do {
            // 查找目标线程
            if (te.th32OwnerProcessID == processId && te.th32ThreadID == threadId) {
                // 打开线程
                HANDLE hThread = OpenThread(THREAD_TERMINATE, FALSE, te.th32ThreadID);
                if (hThread != NULL) {
                    // 终止线程
                    if (TerminateThread(hThread, 0)) {
                        printf("Terminated thread: %u in process: %u\n", te.th32ThreadID, processId);
                    } else {
                        printf("Failed to terminate thread (%d).\n", GetLastError());
                    }
                    CloseHandle(hThread);
                } else {
                    printf("Failed to open thread (%d).\n", GetLastError());
                }
                break; // 找到后退出循环
            }
        } while (Thread32Next(hSnapshot, &te));
    } else {
        printf("Failed to get first thread (%d).\n", GetLastError());
    }

    // 关闭快照句柄
    CloseHandle(hSnapshot);