检测某个程序是否在进程中执行

从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')结构长度(二进制),+ 7DWORD + 1LONG 8 * 4(DWORDLONGS4个字节) 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值