CreateToolhelp32Snapshot 收藏
CreateToolhelp32Snapshot
  CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。   
HANDLE WINAPI CreateToolhelp32Snapshot(   DWORD dwFlags,   DWORD th32ProcessID   );   
参数:   dwFlags   [输入]指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。   TH32CS_INHERIT - 声明快照句柄是可继承的。   
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。   
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。   
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。   
TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。   
TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。   
Const TH32CS_SNAPHEAPLIST = &H1   
Const TH32CS_SNAPPROCESS = &H2   
Const TH32CS_SNAPTHREAD = &H4   
Const TH32CS_SNAPMODULE = &H8   
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)   
Const TH32CS_INHERIT = &H80000000   
th32ProcessID   [输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPALL后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。   
返回值:   调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE 。   
备注:   使用GetLastError函数查找该函数产生的错误状态码。   
要删除快照,使用CloseHandle函数   
delphi使用实例:   
uses TLHelp32;   
procedure TForm1.Button1Click(Sender: TObject);   
var   ProcessName: string;   
ProcessID: integer;   
ListLoop: Boolean;   
FsnapShotHandle: Thandle;   
FProcessEntry32: TProcessEntry32;   
begin   Fsnapshothandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);   FProcessEntry32.dwsize := SizeOF(FProcessEntry32);   
Listloop := Process32First(FSnapshotHandle, FProcessEntry32);   
while Listloop do begin   
ProcessName := FprocessEntry32.szExeFile;   
ProcessID := FProcessEntry32.th32ProcessID;   // 我写到列表框中了,你可以根据需要自己改   
listbox1.Items.Add('Process NAME:' + ProcessNAme);   
ListLoop := Process32Next(FSnapshotHandle, FprocessEntry32);   
end;   
end;   
/
VB使用实例:   Private Type PROCESSENTRY32   dwSize As Long   cntUseage As Long   th32ProcessID As Long   th32DefaultHeapID As Long   th32ModuleID As Long   cntThreads As Long   th32ParentProcessID As Long   pcPriClassBase As Long   swFlags As Long   szExeFile As String * 1024   End Type   Private sub demo()   Dim MySnapHandle As Long   Dim ProcessInfo As PROCESSENTRY32   MySnapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)   ProcessInfo.dwSize = Len(ProcessInfo)   If Process32First(MySnapHandle, ProcessInfo) <> 0 Then   Do   If Left(LCase(ProcessInfo.szExeFile), InStr(ProcessInfo.szExeFile, ".") + 3) = "notepad.exe" Then   '遍历进程,查找notepad.exe,找到后执行操作.......   End If   Loop While Process32Next(MySnapHandle, ProcessInfo) <> 0   End If   CloseHandle MySnapHandle   end sub   C++例子:   #include "StdAfx.h"   #include "windows.h"   #include "tlhelp32.h"   #include "stdio.h"   int main(int argc, char* argv[])   {   PROCESSENTRY32 pe32;   //在使用这个结构前,先设置它的大小   pe32.dwSize = sizeof(pe32);   //给系统内所有的进程拍个快照   HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   if (hProcessSnap == INVALID_HANDLE_VALUE)   {   printf("CreateToolhelp32Snapshot 调用失败./n");   return -1;   }   //遍历进程快照,轮流显示每个进程的信息   BOOL bMore = ::Process32First(hProcessSnap,&pe32);   while (bMore)   {   printf("进程名称:%s/n",pe32.szExeFile);   printf("进程ID:%u/n/n",pe32.th32ProcessID);   bMore = ::Process32Next(hProcessSnap,&pe32);   }   //不要忘记清除掉snapshot对象   ::CloseHandle(hProcessSnap);   return 0;   }
//
为什么必须要使用CloseHandle关闭句柄

1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。

2,线程是一种内核对象,系统维护着每一个内核对象,当每个内核对象引用记数为0时,系统就从内存中释放该对象,CloseHandle就是将该线程对象的引用记数减1。所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。

3,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。

所以

CloseHandel(ThreadHandle );

只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

如果你觉得多了一个变量,也可以写为:

CloseHandel(CreateThread(NULL,0,.....));

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zen_z/archive/2010/05/31/5637548.aspx

CreateToolhelp32Snapshot相关推荐

  1. 获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot

    http://www.cnblogs.com/qintangtao/archive/2013/02/26/2933734.html CreateToolhelp32Snapshot函数通过获取进程信息 ...

  2. linux tlhelp32.h,CreateToolhelp32Snapshot

    CreateToolhelp32Snapshot函数为指定的进程.进程使用的堆[HEAP].模块[MODULE].线程[THREAD])建立一个快照[snapshot]. HANDLE WINAPI ...

  3. 用CreateToolhelp32Snapshot、Process32First、Process32Next枚举进程(BCB)

    这仅仅是个示例,具体操作需要自己完成 需要 #include <tlhelp32.h>    PROCESSENTRY32 pe32;    pe32.dwSize  =   sizeof ...

  4. PROCESSENTRY32结构体 CreateToolhelp32Snapshot Process32First 和Process32Next

    文章目录 ```PROCESSENTRY32```结构体 参数解释 第一个参数 第二个参数 第三个参数 第四个参数 第五个参数 第六个参数 第七个参数 第八个参数 第九个参数 第十个参数 Create ...

  5. 62.根据系统进程快照获得枚举系统进程PROCESSENTRY32、CreateToolhelp32Snapshot、Process32First、Process32Next

    首先要包含头文件,帮助工具函数的头文件 #include <TlHelp32.h> 先说一个结构体,用于保存取得操作系统进程快照的信息 PROCESSENTRY32 typedef str ...

  6. CreateToolhelp32Snapshot枚举进程

    CreateToolhelp32Snapshot枚举进程 要实现功能描述 :在进程中关闭某一应用程序.(常用于 :系统监控类软件) 处理思路分为两步:借助系统快照实现对系统当前进程的枚举和根据枚举结果 ...

  7. 通过CreateToolhelp32Snapshot函数获得系统中当前运行的进程信息2

    这是昨天程序的改进版,调用了OpenProcess函数,并输出了函数执行情况,程序代码如下: Code #include <windows.h> #include <tlhelp32 ...

  8. c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践

    1.进程间通信简述 进程间通信的几种方式:无名管道.有名管道.消息队列.共享内存.信号.信号量.套接字(socket). 进程间通信是不同进程直接进行的一些接触,这种接触有简单,有复杂.机制不同,复杂 ...

  9. c++ createtoolhelp32snapshot取进程路径_理解进程和线程

    进程和线程是操作系统里很重要的概念,但是所有的东西都会落实到代码.看起来很复杂的进程线程,其实在操作系统的代码里.也只是一些数据结构和算法.只不过他比一般的数据结构和算法可能复杂点.但是学习方法还是一 ...

最新文章

  1. 从原理到实操,看当前最佳的YOLO V4是如何炼成的?
  2. postman发送json请求,使用案例
  3. PPS2013校园招聘笔试题
  4. 本地虚拟机上的docker安装mysql_Linux虚拟机上安装docker,并使用docker安装mysql,tomcat...
  5. 杨元庆:出身中国是联想吸引国际用户的障碍
  6. python中os.path.dirname(__file__)的使用(获取文件夹路径)(获取当前py文件绝对路径)
  7. CEdit CRichEdit 使用技巧(转)
  8. 数值分析(第五版) 第九章知识点总结
  9. android api接口封装,android-apidesigner是一个网络接口封装工具
  10. EntityFramework Codefirst Select 查询指定列
  11. 拓端tecdat|R语言基于温度对城市层次聚类、kmean聚类、主成分分析和Voronoi图可视化
  12. python微信聊天机器人_用python实现微信聊天机器人
  13. 软考软件设计师本人成功备考经验分享
  14. 来自Carson_Ho大神的最6的Android事件分发机制详解
  15. Mean Rank 和Mean reciprocal rank
  16. 配色表 色卡 前段色彩
  17. 揭秘“菲住布渴”中运用的黑科技:除了check in、坐电梯、开门...全部刷脸之外,还有什么?
  18. 动态分析Android App之动态调试(一)
  19. cubic 如何用matlab,求助高手解决cubic绘图问题
  20. wdcp服务器权限修改,Linux下wdcp控制面板安装tipask3.0教程

热门文章

  1. 如何下载 Intel Integrated Performance Primitives –intel IPP
  2. 批量消除图片的杂色背景
  3. HD 1159 Common Subsequence (最长公共子序列)
  4. hdu 2881(简单dp)
  5. Eclispse中Run on Server窗口让选择Server,但已经存在的选择不了
  6. NYOJ 409 郁闷的C小加(三)
  7. 70. Climbing Stairs
  8. 关于springmvc下服务器文件打包成zip格式下载功能
  9. [Java]图片压缩
  10. 解决springmvc在单纯返回一个字符串对象时所出现的乱码情况(极速版)