看流星社区

 找回密码
 注册账号
查看: 2091|回复: 0

VC中 CreateToolhelp32Snapshot() 的用法

[复制链接]

该用户从未签到

发表于 2014-3-3 19:34:04 | 显示全部楼层 |阅读模式
该API头文件为:
#include "Tlhelp32.h"

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后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。

  返回值:

  调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE 。

  备注:

  使用GetLastError函数查找该函数产生的错误状态码。

  (这里有误:)要删除快照,使用CloseHandle函数

  参考MSDN原文:

  To close a snapshot, call the CloseToolhelp32Snapshot function.

  Do not call the CloseHandle function to close the snapshot call. That generates a memory leak.

  关闭一个快照,调用CloseToolhelp32Snapshot函数。

  不要调用CloseHandle函数关闭关照。这会造成内存泄漏。

  以下更改C++例子,delphi和VB例子请协助更改。

  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,这会造成内存泄漏

  //::CloseHandle(hProcessSnap);

  //调用CloseToolhelp32Snapshot关闭快照

  ::CloseToolhelp32Snapshot(hProcessSnap);

   return 0;

  }
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-15 06:20

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表