从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