检测某个程序是否在进程中执行
2008-09-03 22:14
169 查看
从dkfdtf “列举系统进程及调用模块”中简化出:
clear
?checkExeRun('vfp9.exe')
?checkExeRun('excel.exe')
* 检测某个程序是否在进程中执行
function checkExeRun
#define TH32CS_SNAPPROCESS 0x00000002
#define ERROR_NO_MORE_FILES 18
lparameters tcExeName
declare long GetLastError in Win32API &&获取最后错误代码值
declare long CreateToolhelp32Snapshot in Win32API ; &&创建进程快照
long dwFlags, long th32ProcessID
declare Long Process32First in Win32API long hSnapshot, string @ lppe
declare long Process32Next in Win32API long hSnapshot, string @ lppe
declare long CloseHandle in Win32API long hObject
local lnHSS,lcBuff,lnPid,lnSize,llState,lcProgName
lnHSS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) &&创建进程快照,获取所有进程(TH32CS_SNAPPROCESS)。
if lnHSS = -1
return .f.
endif
lnSize = 8 * 4 + 260
* bintoc(4 + lnSize,'rs')结构长度(二进制),+ 7个DWORD + 1上LONG 8 * 4(DWORD和LONGS均4个字节) char szExeFile[MAX_PATH] MAX_PATH(260)
* 详细内容参考MSDN的 PROCESSENTRY32 结构
lcBuff = bintoc(4 + lnSize,'rs') + replicate(chr[0],lnSize)
if Process32First(lnHSS,@lcBuff) = 0 &&从快照中获取第一个进程,若为0则关闭快照并返回
CloseHandle(lnHSS)
return .f.
endif
do while .t.
* 将二进制(9-12中的4个字节)转为数值获取进程标识(PID)
lnPid = ctobin(substr(lcBuff,9,4),'rs')
lcProgName = lower(justfname(GetImgFile(lnPid,0))) &&根据PID获取对应映像程序(EXE)
if lcProgName == lower(tcExeName)
llState = .t.
exit
endif
lcBuff = bintoc(4 + lnSize,'rs') + replicate(CHR[0],lnSize)
* 获取下一个进程,若为0或获取错误则退出循环
if Process32Next(lnHSS,@lcBuff) = 0 or ERROR_NO_MORE_FILES == GetLastError()
exit
endif
enddo
CloseHandle(lnHSS) &&关闭句柄
return llState
endfunc
* 根据进程ID获取对应的映像名(.EXE)
procedure GetImgFile
#define PROCESS_VM_READ 0x0010
#define PROCESS_QUERY_INFORMATION 0x0400
#define PROCESS_ALL_ACCESS 0x001FFFFF
* 接收传入参数
lparameters tnPid,thModule
* 定义相关API函数
declare long OpenProcess in WIN32API ; &&打开进程对象
long dwDesiredAccess,long bInheritHandle,long dwProcessId
declare long GetModuleFileNameEx in PsApi ; &&获取某个进程对应文件的完全路径名
long hProcess,long hModule,string @ lpExename,long dwSize
if tnPid = 0
return ''
endif
local lnHProc,lcFile,lnSize
* 根据tnPid标识,从内存中读取一个进程,并查询进程信息,lnHProc为该进程句柄
lnHProc = OpenProcess(PROCESS_VM_READ + PROCESS_QUERY_INFORMATION,0,tnPid)
if lnHProc = 0
return ''
else
lnSize = 260
lcFile = replicate(chr[0],lnSize)
* 根据lnHProc进程句柄,获取该进程文件的完全路径及文件名
lnSize = GetModuleFileNameEx(lnHProc,thModule,@lcFile,lnSize)
CloseHandle(lnHProc)
lcFile = leftc(lcFile,lnSize)
endif
return lcFile
endproc
参考资料:http://blog.csdn.net/dkfdtf/archive/2008/07/05/2614284.aspx
clear
?checkExeRun('vfp9.exe')
?checkExeRun('excel.exe')
* 检测某个程序是否在进程中执行
function checkExeRun
#define TH32CS_SNAPPROCESS 0x00000002
#define ERROR_NO_MORE_FILES 18
lparameters tcExeName
declare long GetLastError in Win32API &&获取最后错误代码值
declare long CreateToolhelp32Snapshot in Win32API ; &&创建进程快照
long dwFlags, long th32ProcessID
declare Long Process32First in Win32API long hSnapshot, string @ lppe
declare long Process32Next in Win32API long hSnapshot, string @ lppe
declare long CloseHandle in Win32API long hObject
local lnHSS,lcBuff,lnPid,lnSize,llState,lcProgName
lnHSS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) &&创建进程快照,获取所有进程(TH32CS_SNAPPROCESS)。
if lnHSS = -1
return .f.
endif
lnSize = 8 * 4 + 260
* bintoc(4 + lnSize,'rs')结构长度(二进制),+ 7个DWORD + 1上LONG 8 * 4(DWORD和LONGS均4个字节) char szExeFile[MAX_PATH] MAX_PATH(260)
* 详细内容参考MSDN的 PROCESSENTRY32 结构
lcBuff = bintoc(4 + lnSize,'rs') + replicate(chr[0],lnSize)
if Process32First(lnHSS,@lcBuff) = 0 &&从快照中获取第一个进程,若为0则关闭快照并返回
CloseHandle(lnHSS)
return .f.
endif
do while .t.
* 将二进制(9-12中的4个字节)转为数值获取进程标识(PID)
lnPid = ctobin(substr(lcBuff,9,4),'rs')
lcProgName = lower(justfname(GetImgFile(lnPid,0))) &&根据PID获取对应映像程序(EXE)
if lcProgName == lower(tcExeName)
llState = .t.
exit
endif
lcBuff = bintoc(4 + lnSize,'rs') + replicate(CHR[0],lnSize)
* 获取下一个进程,若为0或获取错误则退出循环
if Process32Next(lnHSS,@lcBuff) = 0 or ERROR_NO_MORE_FILES == GetLastError()
exit
endif
enddo
CloseHandle(lnHSS) &&关闭句柄
return llState
endfunc
* 根据进程ID获取对应的映像名(.EXE)
procedure GetImgFile
#define PROCESS_VM_READ 0x0010
#define PROCESS_QUERY_INFORMATION 0x0400
#define PROCESS_ALL_ACCESS 0x001FFFFF
* 接收传入参数
lparameters tnPid,thModule
* 定义相关API函数
declare long OpenProcess in WIN32API ; &&打开进程对象
long dwDesiredAccess,long bInheritHandle,long dwProcessId
declare long GetModuleFileNameEx in PsApi ; &&获取某个进程对应文件的完全路径名
long hProcess,long hModule,string @ lpExename,long dwSize
if tnPid = 0
return ''
endif
local lnHProc,lcFile,lnSize
* 根据tnPid标识,从内存中读取一个进程,并查询进程信息,lnHProc为该进程句柄
lnHProc = OpenProcess(PROCESS_VM_READ + PROCESS_QUERY_INFORMATION,0,tnPid)
if lnHProc = 0
return ''
else
lnSize = 260
lcFile = replicate(chr[0],lnSize)
* 根据lnHProc进程句柄,获取该进程文件的完全路径及文件名
lnSize = GetModuleFileNameEx(lnHProc,thModule,@lcFile,lnSize)
CloseHandle(lnHProc)
lcFile = leftc(lcFile,lnSize)
endif
return lcFile
endproc
参考资料:http://blog.csdn.net/dkfdtf/archive/2008/07/05/2614284.aspx
相关文章推荐
- 通过进程检测服务时脚本文件名不要起要检测的服务名字命名 shell程序从上到下执行若定义函数或引用系统函数需先定义 kill -USR2
- Linux下检测程序进程是否正常并重启的脚本
- linux的shell命令检测某个java程序是否执行
- 用Linux守护进程检测某个程序是否运行
- shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
- 批处理和VBS检测进程是否存在并执行相关操作
- linux的shell命令检测某个java程序是否执行
- 检测进程是否存在的小函数&&检测命令是否执行成功的小函数
- 用Linux守护进程检测某个程序是否运行
- shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
- 用Linux守护进程检测某个程序是否运行2
- PHP里的SQL语句是否正确,是否正确执行的检测方法。
- 小程序 - 链表检测环/链表是否交叉 等
- Linux操作系统分析(2)- 进程的创建与可执行程序的加载
- linux 进程、执行方式、程序、编程元素
- windows 批处理(bat)中执行程序后不等待直接退出(cmd中新进程执行程序)
- 根据进程名称判断程序是否运行
- C语言getpriority()函数:取得程序进程执行优先权
- c# 使用Process调用外部程序时等待该进程结束后再执行住进程
- alert7写的检测linux是否运行在VMWARE中的一个程序