• WindowsAPI 进程和线程相关说明


    前言

    当提到操作系统中的进程和线程之间的管理时,Windows API提供了一系列有用的函数来处理这些任务。

    Windows API提供了丰富的函数和数据结构,用于处理进程和线程的管理。以下是一些常用的Windows API函数和数据结构:

    进程管理:

    • CreateProcess:创建新进程。
    • OpenProcess:打开已存在的进程。
    • TerminateProcess:终止指定进程的执行。
    • GetCurrentProcess:获取当前进程的句柄。
    • EnumProcesses:枚举正在运行的进程。
    • GetProcessId:获取进程的ID。
    • GetProcessTimes:获取进程的执行时间。
    • GetProcessMemoryInfo:获取进程的内存信息。

    线程管理:

    • CreateThread:创建新线程。
    • OpenThread:打开已存在的线程。
    • TerminateThread:终止指定线程的执行。
    • GetCurrentThread:获取当前线程的句柄。
    • GetThreadId:获取线程的ID。
    • SuspendThread:暂停线程的执行。
    • ResumeThread:恢复线程的执行。
    • GetThreadPriority:获取线程的优先级。

    进程管理

    CreateProcess:

    CreateProcess函数是用于创建新进程的关键函数之一。它接受一系列参数,包括可执行文件路径、命令行参数、安全属性等等。CreateProcess函数将新进程创建为子进程,并返回一个进程句柄和主线程句柄,可以使用这些句柄来操作和管理新进程。

    TerminateProcess:

    TerminateProcess函数用于终止指定进程。它接受一个进程句柄和一个退出码作为参数,并立即终止该进程。需要注意的是,终止进程是一种强制性的操作,不会给进程以正常的退出机会,因此需要谨慎使用。

    OpenProcess:

    OpenProcess函数用于打开一个已存在的进程。它接受进程访问权限和进程ID作为参数,并返回一个进程句柄。通过打开进程句柄,可以对该进程进行一系列操作,如读取/写入进程内存、获取进程信息等。

    CloseHandle:

    CloseHandle函数用于关闭一个打开的对象句柄,包括进程句柄和线程句柄。当不再需要使用某个句柄时,应该调用CloseHandle来释放资源。注意,不要关闭无效的句柄,否则可能会导致意外的错误。

    线程管理

    CreateThread:

    CreateThread函数用于创建一个新线程。它接受线程安全属性、堆栈大小、线程函数地址等参数,并返回一个线程句柄。通过线程句柄,可以操作和管理新创建的线程。

    TerminateThread:

    TerminateThread函数用于终止指定线程。它接受一个线程句柄和一个退出码作为参数,并立即终止该线程的执行。与终止进程类似,终止线程也是一种强制性的操作,可能会导致资源无法正确释放和数据丢失。

    SuspendThread:

    SuspendThread函数用于挂起指定线程的执行。它接受一个线程句柄作为参数,并暂停该线程的执行。挂起的线程可以通过ResumeThread函数来恢复执行。

    ResumeThread:

    ResumeThread函数用于恢复被挂起的线程的执行。它接受一个线程句柄作为参数,并使挂起的线程继续执行。

    GetThreadContext:

    GetThreadContext函数用于获取指定线程的上下文信息。它接受一个线程句柄和一个CONTEXT结构体作为参数,并从线程的执行上下文中填充信息到结构体中。这些信息包括寄存器状态等。

    以上这些函数是Windows API中一部分用于进程和线程管理的关键函数。它们提供了强大的功能,使我们可以在操作系统级别对进程和线程进行操作和控制。在使用它们的过程中,需要仔细考虑各种边界条件和安全性,以确保正确的使用与操作。

    代码例子

    Imports System.Diagnostics
    
    Module Module1
    
        Sub Main()
            ' 创建新进程
            Dim process As New Process()
            process.StartInfo.FileName = "notepad.exe"
            process.Start()
    
            ' 获取正在运行的进程信息
            Dim runningProcesses As Process() = Process.GetProcesses()
            For Each p As Process In runningProcesses
                Console.WriteLine("进程名: " & p.ProcessName & ",ID: " & p.Id)
            Next
    
            ' 终止进程
            Dim processToTerminate As Process = Process.GetProcessesByName("notepad").FirstOrDefault()
            If processToTerminate IsNot Nothing Then
                processToTerminate.Kill()
            End If
    
            ' 创建新线程
            Dim thread As New Threading.Thread(AddressOf ThreadFunction)
            thread.Start()
    
            ' 暂停线程
            thread.Suspend()
    
            ' 恢复线程
            thread.Resume()
    
            ' 等待线程结束
            thread.Join()
        End Sub
    
        Sub ThreadFunction()
            Console.WriteLine("线程运行中...")
            Threading.Thread.Sleep(3000)
            Console.WriteLine("线程运行结束")
        End Sub
    
    End Module
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在上述示例中,我们首先使用 Process.Start 函数创建了一个新的进程,通过指定进程的可执行文件名来启动了记事本应用程序。然后,我们通过 Process.GetProcesses 函数获取当前正在运行的所有进程,并输出了每个进程的名称和ID。

    接下来,我们使用 Process.GetProcessesByName 函数获取指定名称的进程对象,并调用 Kill 方法终止这个进程的执行。

    之后,我们创建了一个新线程,并使用 Threading.Thread.Suspend 和 Threading.Thread.Resume 分别暂停和恢复了这个线程的执行。最后,我们使用 Threading.Thread.Join 函数等待线程执行完毕。

    请注意 这只是一个简单的示例,实际使用中需要注意错误处理、资源释放等方面的考虑。







    大鹏一日同风起 扶摇直上九万里 加油!!!!


    END
  • 相关阅读:
    货物寄到英国选择什么物流比较划算?
    MapReduce编程框架
    python 中用opencv开发虚拟键盘------可以只选择一个单词不会出现一下选择多个
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[9]比特币-匿名性
    如何选择合适的自动化测试工具?
    Allegro 17.4 SMD 敷铜,Shape 敷铜属性更改, Gerber 生成
    day03视图与逻辑
    一位工作七年的Java工程师给毕业生的经验分享
    【硬件开源电路】STM32G070RBT6开发板
    7-15 求矩阵的局部极大值
  • 原文地址:https://blog.csdn.net/qqq1994_0810/article/details/134337621