f_ifexerun.srf 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. $PBExportHeader$f_ifexerun.srf
  2. global type f_ifexerun from function_object
  3. end type
  4. forward prototypes
  5. global function integer f_ifexerun ()
  6. end prototypes
  7. global function integer f_ifexerun ();s_Process lst_Process //进程结构
  8. String ls_FileName[100],ls_CurExeName //最多100个进程,可改进
  9. ULong ln_ProcessID,ln_SameCount,ln_Snapshot,ln_Circle,ln_Count
  10. ln_ProcessID = GetCurrentProcessId() //取当前进程的ID
  11. IF IsNull(ln_ProcessID) OR ln_ProcessID < 1 THEN RETURN -1 //出错则返回
  12. ln_Snapshot = CreateToolhelp32Snapshot(2,0) //在堆上创建进程快照
  13. If (ln_Snapshot < 1) THEN RETURN -1 //出错则返回
  14. lst_Process.StructSize = 296 //Win32api的Process结构大小
  15. ln_SameCount = 0 //复本数为0
  16. IF Process32First(ln_Snapshot,lst_Process) = 0 THEN RETURN -1//取第一个进程失败则返回
  17. ln_Count = 1
  18. ls_FileName[ln_Count] = lst_Process.Filename //列举的进程名称放入数组
  19. //如列举到的进程ID等于当前进程ID,则知道了当前进程的名称,保存
  20. IF lst_Process.ProcessID = ln_ProcessID THEN ls_CurExeName = lst_Process.Filename
  21. DO WHILE TRUE //循环取列举的进程名称,放入数组
  22. IF Process32Next(ln_Snapshot,lst_Process) = 0 THEN EXIT //列举完毕
  23. ln_Count = ln_Count + 1
  24. ls_FileName[ln_Count] = lst_Process.Filename
  25. IF lst_Process.ProcessID = ln_ProcessID THEN ls_CurExeName = lst_Process.Filename
  26. LOOP
  27. FOR ln_Circle = 1 TO ln_Count //计算系统中有几个同名进程
  28. IF ls_CurExeName = ls_FileName[ln_Circle] THEN ln_SameCount = ln_SameCount+1
  29. NEXT
  30. RETURN ln_SameCount //如当前进程无复本在运行,返回1;否则有几个在运行则返回几
  31. end function