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

int GetProcessStatus(const char *procressName)
{
char pName[MAX_PATH];
strcpy(pName, procressName); // 拷贝数组
CharLowerBuff(pName, MAX_PATH); // 将名称转换为小写 PROCESSENTRY32 currentProcess; // 存放快照进程信息的一个结构体
currentProcess.dwSize = sizeof(currentProcess); // 在使用这个结构之前,先设置它的大小
HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 给系统内的所有进程拍一个快照 if (INVALID_HANDLE_VALUE != hProcess)
{
BOOL bMore = Process32First(hProcess, &currentProcess);
while (bMore)
{
CharLowerBuff(currentProcess.szExeFile, MAX_PATH); // 将进程名转换为小写
if (strcmp(currentProcess.szExeFile, pName) == 0) // 比较是否存在此进程
{
CloseHandle(hProcess);
return currentProcess.th32ProcessID;
}
bMore = Process32Next(hProcess, &currentProcess);
}
CloseHandle(hProcess);
}
return -1;
}

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

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
);

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

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

#include <Windows.h>
#include <stdio.h> // 判断是否重复运行
BOOL IsAlreadyRun()
{
HANDLE hMutex = NULL;
hMutex = CreateMutex(NULL, FALSE, "RUN");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == GetLastError())
return TRUE;
}
return FALSE;
} int main(int argc, const char * argv[])
{
if (IsAlreadyRun() == TRUE)
printf("重复运行 \n");
else
printf("没有重复运行 \n"); system("pause");
return 0;
}

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

#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h> // 判断自身系统是否为64位
BOOL IsSelf64bitSystem()
{
SYSTEM_INFO si;
GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
return TRUE;
else
return FALSE;
} // 判断指定进程是否为64位进程
BOOL Is64BitPorcess(DWORD dwProcessID)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);
if (hProcess)
{
typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)
GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process");
if (NULL != fnIsWow64Process)
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process(hProcess, &bIsWow64);
CloseHandle(hProcess);
if (bIsWow64)
return FALSE;
else
return TRUE;
}
}
return FALSE;
} int main(int argc, char *argv[])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL bMore = Process32First(hProcessSnap, &pe32); while (bMore)
{
printf("进程PID: %5d 是否64位: %d 进程名称: %s\n",
pe32.th32ProcessID, Is64BitPorcess(pe32.th32ProcessID), pe32.szExeFile); bMore = Process32Next(hProcessSnap, &pe32);
}
system("pause");
return 0;
}

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. Java FTP操作

    pom引用: <dependency> <groupId>commons-net</groupId> <artifactId>commons-net&l ...

  2. 第十二届蓝桥杯C++B组 A~H题题解

    本次题解格式参考 墨羽魂韶 本文所用的试题: 第十二届蓝桥杯大赛软件赛省赛_CB.pdf 最后编辑时间 2021年4月29日 21:27:46 2022 年 4月 8号 15点13分 填空题答案速览 ...

  3. Kite 使用教程 轻量级代码提示

    概述 今天看小甲鱼视频的VSC Python 安装教程里视频博主强烈推荐安装Kite插件 ,这是什么玩意? 下载下来试一试? 原来:就是一个代码提示插件.. 说白了" 就是让开发者 在轻量级 ...

  4. vivo 悟空活动中台 - 微组件状态管理(下)

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/1DzTYIExVbK0uE_Oc7IHYw作者:悟空中台研发团队 [悟空活动中台]系列往期精 ...

  5. map三层循环遍历,操作数据

    let tempArr = this.oldCityList.map(item => { return { value: item.code, text: item.name, type: it ...

  6. 如何一键私有化部署 Laf ?

    太长不看:Laf 上架了 Sealos 的模板市场,通过 Laf 应用模板即可一键部署! Laf 是一个完全开源的项目,除了使用公有云之外,还有大量的用户选择私有化部署 Laf.然而,私有化部署通常伴 ...

  7. vmware超融合基础安装与配置

    目录 vmware超融合 安装配置ESXI 安装VMware vCenter Server 安装vCenter插件 安装vCenter 使用VMware Vsphere Client登录Vcenter ...

  8. java - 对象装载数据返回

    1. 创建 Phone 类 package class_object; public class Phone { String brand; String color; double price; v ...

  9. (保姆级)服务器-Zabbix6.0使用Python脚本实现带图片的邮箱的报警

    前言 近期在琢磨Zabbix邮箱报警的功能,但是网上的教程通常是4.0或5.0版本Zabbix,并使用Python2.7环境,运行在新版本Zabbix6.0上有颇多问题,为此我基于原先教程修改基于Za ...

  10. [转帖]浪潮PM8222-SHBA、RAID 2GB PM8204、RAID 4GB PM8204,阵列卡配置方法

    1.8222和8204对比 这几个型号的阵列卡都很相似,配置方法也基本一样 8204就是在8222上的基础上增加了缓存,可以通过下图对比 正面8204比8222多一个掉电保护接口 8204背面多了几个 ...