进程状态的判断包括验证进程是否存在,实现方法是通过枚举系统内的所有进程信息,并将该进程名通过CharLowerBuff转换为小写,当转换为小写模式后则就可以通过使用strcmp函数对比,如果发现继承存在则返回该进程的PID信息,否则返回-1。

  1. int GetProcessStatus(const char *procressName)
  2. {
  3. char pName[MAX_PATH];
  4. strcpy(pName, procressName); // 拷贝数组
  5. CharLowerBuff(pName, MAX_PATH); // 将名称转换为小写
  6. PROCESSENTRY32 currentProcess; // 存放快照进程信息的一个结构体
  7. currentProcess.dwSize = sizeof(currentProcess); // 在使用这个结构之前,先设置它的大小
  8. HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 给系统内的所有进程拍一个快照
  9. if (INVALID_HANDLE_VALUE != hProcess)
  10. {
  11. BOOL bMore = Process32First(hProcess, &currentProcess);
  12. while (bMore)
  13. {
  14. CharLowerBuff(currentProcess.szExeFile, MAX_PATH); // 将进程名转换为小写
  15. if (strcmp(currentProcess.szExeFile, pName) == 0) // 比较是否存在此进程
  16. {
  17. CloseHandle(hProcess);
  18. return currentProcess.th32ProcessID;
  19. }
  20. bMore = Process32Next(hProcess, &currentProcess);
  21. }
  22. CloseHandle(hProcess);
  23. }
  24. return -1;
  25. }

有时候我们需要判断自身进程是否被重复运行了,这种需求在软件开发中经常会遇到,通常该需求可以使用CreateMutex创建或打开一个互斥量对象(Mutex Object),在多线程/进程的环境下,互斥量可用于控制对某个共享资源的访问。其函数声明如下:

  1. HANDLE CreateMutex(
  2. LPSECURITY_ATTRIBUTES lpMutexAttributes,
  3. BOOL bInitialOwner,
  4. LPCTSTR lpName
  5. );

其中,lpMutexAttributes 是用于指定新创建的互斥量的安全描述符的指针;bInitialOwner 表示一个布尔值,指定初始所有权标记,为 TRUE 表示调用线程将拥有该互斥量,否则表示它不属于调用线程;lpName 是可选的,用于命名互斥体,以使得其他线程或者进程可以通过这个名字来打开该互斥量对象。

CreateMutex 函数会返回一个内核对象句柄,用于在之后对该互斥体进行引用和操作,通过使用互斥体可以很容易的实现对进程运行状态的判断。

  1. #include <Windows.h>
  2. #include <stdio.h>
  3. // 判断是否重复运行
  4. BOOL IsAlreadyRun()
  5. {
  6. HANDLE hMutex = NULL;
  7. hMutex = CreateMutex(NULL, FALSE, "RUN");
  8. if (hMutex)
  9. {
  10. if (ERROR_ALREADY_EXISTS == GetLastError())
  11. return TRUE;
  12. }
  13. return FALSE;
  14. }
  15. int main(int argc, const char * argv[])
  16. {
  17. if (IsAlreadyRun() == TRUE)
  18. printf("重复运行 \n");
  19. else
  20. printf("没有重复运行 \n");
  21. system("pause");
  22. return 0;
  23. }

对进程位数的判断也是有必要的,通常在Windows系统下进程位数的有多种方法实现,第一种方式GetNativeSystemInfo调用该函数并判断函数内的特定成员,即可得到当前系统是否为64位,当然通过使用Is64BitPorcess函数也可实现对特定进程的判断,此方式实现原理是通过调用IsWow64Process函数实现;

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <tlhelp32.h>
  4. // 判断自身系统是否为64位
  5. BOOL IsSelf64bitSystem()
  6. {
  7. SYSTEM_INFO si;
  8. GetNativeSystemInfo(&si);
  9. if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
  10. si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
  11. return TRUE;
  12. else
  13. return FALSE;
  14. }
  15. // 判断指定进程是否为64位进程
  16. BOOL Is64BitPorcess(DWORD dwProcessID)
  17. {
  18. HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);
  19. if (hProcess)
  20. {
  21. typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
  22. LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)
  23. GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process");
  24. if (NULL != fnIsWow64Process)
  25. {
  26. BOOL bIsWow64 = FALSE;
  27. fnIsWow64Process(hProcess, &bIsWow64);
  28. CloseHandle(hProcess);
  29. if (bIsWow64)
  30. return FALSE;
  31. else
  32. return TRUE;
  33. }
  34. }
  35. return FALSE;
  36. }
  37. int main(int argc, char *argv[])
  38. {
  39. PROCESSENTRY32 pe32;
  40. pe32.dwSize = sizeof(pe32);
  41. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  42. BOOL bMore = Process32First(hProcessSnap, &pe32);
  43. while (bMore)
  44. {
  45. printf("进程PID: %5d 是否64位: %d 进程名称: %s\n",
  46. pe32.th32ProcessID, Is64BitPorcess(pe32.th32ProcessID), pe32.szExeFile);
  47. bMore = Process32Next(hProcessSnap, &pe32);
  48. }
  49. system("pause");
  50. return 0;
  51. }

7.5 通过API判断进程状态的更多相关文章

  1. VB API判断数组为空

    1. 'API判断数组为空或没有初始化 Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saA ...

  2. Delphi Windows API判断文件共享锁定状态(OpenFile和CreateFile两种方法)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  3. Delphi Windows API判断文件共享锁定状态(使用OpenFile来判断)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  4. C#通过系统API判断已经连接互联网

    win32   API函数的做法: 要用的函数:InternetGetConnectedState 函数原形:BOOL   InternetGetConnectedState(LPDWORD   lp ...

  5. Revit API判断是不是柱族模板

    OwnerFamily即族模板.获取类别的方法:Document.Settings.Categories.get_Item(BuiltInCategory.OST_Columns); //判断是不是柱 ...

  6. 浅谈android反调试之 API判断

    反调试:利用Java层API来判断Android程序是否是处于被调试下. 1.直接调用系统的android.os.Debug.isDebuggerConnected()方法 我们进行动态调试的时候,其 ...

  7. 「踩坑记」Android API 判断权限申请结果的闪退问题

    这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...

  8. API判断网站IP地址,国家区域

    直接访问http://api.wipmania.com/jsonp 还有经纬度

  9. Robotium API -- 判断测试结果的方法assert、is、search

    下面的这些方法都主要用来判断测试结果是否与预期结果相符,一般把is和search方法放在assert里面判断.assert最常用的还是assertThat方法,是Junit的判断,这里就不多说了. 断 ...

  10. 微信小程序城市定位(借助百度地图API判断城市)

    概述 微信小程序提供一些API(地址)用于获取当前用户的地理位置等信息,但无论是wx.getLocation,还是wx.chooseLocation均没有单独的字段表示国家与城市信息,仅有经纬度信息. ...

随机推荐

  1. 【HZERO】宏函数

    宏函数配置

  2. 10.4K Star!程序员为程序员针对性优化的开源免费笔记

    平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品.上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家:VNote. VNote一个由程序员为程序员打造的开源笔记应用,基于Qt ...

  3. JSP | 常见 JSP 简答题

    一.简述 JSP 的工作原理 当我们访问一个JSP页面的时候,这个文件首先会被JSP引擎翻译为一个Java源文件,其实就是一个Servlet,并进行编译,然后像其他Servlet一样,由Servlet ...

  4. AcWing第四场周赛

    比赛链接:Here AcWing 3694. A还是B 签到题 void solve() { int n; string s; cin >> n >> s; int t = c ...

  5. 全国城市地级市区县sql

    全国城市地级市区县sql CREATE TABLE `region` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar( ...

  6. 为什么我要迁移SpringBoot到函数计算

    前言 为什么要迁移? 我们的业务有很多对外提供服务的 RESTful API,并且要执行很多不同的任务,例如同步连锁 ERP 中的商品信息到美团/饿了么等平台,在线开发票等.由于各种 API 和任务执 ...

  7. springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频

    springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频 一.效果: 1.上传图片 2.显示上传的图片 3.上传的视频 4.显示上传的视频 二.代码 没依赖特殊的包,引入sprin ...

  8. h5响应式方案设计

  9. asp.net core之Kestrel

    简介 在ASP.NET Core中,Kestrel是一个重要的组件,它是一个跨平台的.开源的Web服务器,专门为ASP.NET Core应用程序而设计.Kestrel以其轻量级和高性能而闻名,本文将介 ...

  10. Angular系列教程之依赖注入详解

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...