首先了解枚举进程需要用到的相关的api:CreateToolhelp32Snapshot 获取进程快照

[C]  纯文本查看 复制代码
?
1
2
3
4
5
6
函数原型:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);
//调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE

Process32First 获取第一个进程信息

[C]  纯文本查看 复制代码
?
1
2
3
4
Process32First(
     HANDLE hSnapshot, //CreateToolhelp32Snapshot 返回的句柄
     LPPROCESSENTRY32 lppe //保存进程信息的结构
);

PROCESSENTRY32 结构如下:

[C]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
typedef struct tagPROCESSENTRY32 {
     DWORD dwSize; // 结构大小;
     DWORD cntUsage; // 此进程的引用计数;
     DWORD th32ProcessID; // 进程ID;
     DWORD th32DefaultHeapID; // 进程默认堆ID;
     DWORD th32ModuleID; // 进程模块ID;
     DWORD cntThreads; // 此进程开启的线程计数;
     DWORD th32ParentProcessID; // 父进程ID;
     LONG pcPriClassBase; // 线程优先权;
     DWORD dwFlags; // 保留;
     WCHAR szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;

Process32Next 来获得下一个进程信息
参数同Process32First  。

纯C语言实现代码:

[C]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
int main()
{
         PROCESSENTRY32 processEntry = { 0 };
         processEntry.dwSize = sizeof (PROCESSENTRY32);
         HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
         if (hProcessSnap == INVALID_HANDLE_VALUE) return -1;
         
         BOOL bRet = Process32First(hProcessSnap,&processEntry);
         while (bRet)
         {
                 printf ( "ProcessID:%d  %s\n" ,processEntry.th32ProcessID,processEntry.szExeFile);
                 bRet = Process32Next(hProcessSnap,&processEntry);
         }
         CloseHandle(hProcessSnap);
         system ( "pause" );
         return 0;
}

vs2013 执行结果:
<ignore_js_op> 
这时候发现一个很重要的问题,和预料的不同啊,进程名称显示乱码!代码并没有什么指针泄露,也不是printf安全不安全的问题,习惯性的丢到vc6里面,把代码修改为兼容vc6的标准(就是变量定义放在前面):

[C]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
int main()
{
         HANDLE hProcessSnap;
         PROCESSENTRY32 processEntry = { 0 };
         BOOL bRet ;
         processEntry.dwSize = sizeof (PROCESSENTRY32);
         hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
         if (hProcessSnap == INVALID_HANDLE_VALUE) return -1;
         
         bRet= Process32First(hProcessSnap,&processEntry);
         while (bRet)
         {
                 printf ( "ProcessID:%d  %s\n" ,processEntry.th32ProcessID,processEntry.szExeFile);
                 bRet = Process32Next(hProcessSnap,&processEntry);
         }
         CloseHandle(hProcessSnap);
         system ( "pause" );
         return 0;
}

运行结果:
<ignore_js_op> 
竟然没有出现乱码!!
机智的我这时候考虑到了编码问题,vc6的编码是Ansi,vs2013默认的Unicode,
那么vs修改项目文件属性,把字符集Unicode改为多字节字符集(以Ansi为基础的字符集):
<ignore_js_op> 
再次在vs2013下运行:
<ignore_js_op> 
这样就正常了,问题解决。

导致这个问题的原因是在Unicode编码下processEntry.szExeFile是WCHAR(宽字节)类型数组
在多字节字符集下是CHAR(窄字节)类型数组,如果希望不改变项目的字符集解决这一问题,可以通过编码转换的方式把Unicode编码下获取到的processEntry.szExeFile转换为Ansi编码,然后输出。
不改变项目字符集,成功枚举进程的代码:

[C]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
int main()
{
         PROCESSENTRY32 processEntry = { 0 };
         processEntry.dwSize = sizeof (PROCESSENTRY32);
         HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
         if (hProcessSnap == INVALID_HANDLE_VALUE) return -1;
         
         BOOL bRet = Process32First(hProcessSnap,&processEntry);
         while (bRet)
         {
                 int  nLength = WideCharToMultiByte(CP_ACP, 0, processEntry.szExeFile, -1, NULL, 0, NULL, NULL); //获取字符长度
                 char *str = ( char *) malloc ( sizeof ( char )*nLength);
                 WideCharToMultiByte(CP_ACP, 0, processEntry.szExeFile, -1, str, nLength, NULL, NULL); //编码转换-unicode转ansi
                 printf ( "ProcessID:%d  %s\n" ,processEntry.th32ProcessID,str);
                 bRet = Process32Next(hProcessSnap,&processEntry);
         }
         CloseHandle(hProcessSnap);
         system ( "pause" );
         return 0;
}

运行结果同上。

原文地址:http://www.c0ks.com/thread-1291-1-1.html

转载于:https://www.cnblogs.com/yedehei/p/5450382.html

c语言枚举进程以及遇到的编码问题相关推荐

  1. python基础编码规范_Python语言的基本语法和编码规范.doc

    Python 语言的基本语法和编码规范 Python 编程教程教师 : 工作 :Python 语言的基本语法和编码标 准课程描述本章将介绍 Python 语言的基本语法和编码标准,重点介 绍 Pyth ...

  2. c语言解析url编码,在C语言中如何实现对编码后的URL进行解码

    在C语言中如何实现对编码后的URL进行解码 关注:137  答案:2  信息版本:手机版 解决时间 2019-01-11 02:36 蓝琪梦莎 2019-01-10 13:44 在C语言中如何实现对编 ...

  3. Transformer课程:理解语言的 Transformer 模型-位置编码及掩码 (Masking)

    Transformer课程:理解语言的 Transformer 模型-位置编码及掩码 (Masking) 目录 位置编码(Positional encoding) 掩码 (Masking) 参考文献 ...

  4. c语言输出不同字体的汉字,【】c语言中输出汉字的编码

    []c语言中输出汉字的编码 (2012-03-25 22:10:04) 标签: c语言 汉字编码 杂谈 分类: C语言 C语言中,我们用整数输出字符得到的就是该字符的ASII码,如用整数输出a,得到9 ...

  5. C语言实现gbk/utf8/unicode编码转换

    细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4 Unicode与UTF-8互转(C语言实现) 不依赖任何系统API,用c语言实现gbk/utf8/uni ...

  6. linux r语言 指定编码,R语言-进行数据的重新编码(recode)操作

    在分析数据时我们经常会遇到将变量值转换成其他的值的情况(如:将连续变量转成分类变量)这时就需要我们对原有数据进行重新编码.本文将介绍R软件中常用的三种重编吗方法: 1.使用逻辑判断式编码. 2.使用c ...

  7. c语言实型存储方式,.C语言实型数据的编码和存储.pdf

    .C语言实型数据的编码和存储 C 语言实型数据的编码和存储 周恒忠 (皖西学院计算机科学与技术系,安徽 六安 237012 ) 摘 要: C 语言数据类型丰富,而数据类型的确定在程序设计 中又至关重要 ...

  8. 不依赖任何系统API,用c语言实现gbk/utf8/unicode编码转换

    转载地址:https://blog.csdn.net/bladeandmaster88/article/details/54837338 汉字'我' Unicode编码是0x6211       01 ...

  9. 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

    哈夫曼编码的实现及应用论文 毕 业 设 计(论文) 题目 哈夫曼编码的实现 及应用 二级学院 数学与统计学院 专 业 信息与计算科学 班 级 学生姓名 张泽欣 学号 指导教师 职称 时 间 目录 摘要 ...

最新文章

  1. 十年沉浮,用Python看创业公司消亡史
  2. Objective-C单例实现
  3. Zookeeper详解(一):分布式与Zookeeper
  4. GAN模型-分析角度
  5. 中两个数做减法_人生下半场,学会做减法
  6. 高并发下如何缩短响应时间?
  7. 通过思科构造局域网_从Cisco DNA中心的管理的和设置的非结构Catalyst 9800无线局域网控制器...
  8. 【撸码师的备忘录】JedisPool.returnResource()遭弃用
  9. 解决npm安装时出现run `npm audit fix` to fix them, or `npm audit` for details
  10. fedora python3-mysql_centos 下安装python3 的MySQLdb
  11. Pm2 部署 Nuxt 项目
  12. iPad开发强制横屏
  13. JavaWeb整合萤石云(一),VUE和小程序也适用
  14. 万字HTTP学习笔记
  15. 人类一败涂地怎么正在连接服务器,人类一败涂地联机显示正在连接服务器解决办法...
  16. Checking Table 设计模式 - 从概念、建模、设计到实现
  17. 首个搭载8MP摄像头的单SoC行泊一体方案来袭,已拿下多家车企定点
  18. 图像的腐蚀(erosion)和膨胀(dilation)
  19. 婆媳矛盾引发小夫妻动手 女子抄尖刀刺死丈夫
  20. `英语` 2022/8/25

热门文章

  1. 高斯杯全国大学生数学建模挑战赛
  2. LibGDX制作android动态壁纸
  3. jQuery——深浅拷贝
  4. bzoj4518【SDOI2016】征途
  5. C# 数据库查询语句1
  6. 网站服务器数据能不能互通,原神服务器数据是否互通
  7. html+css京东电商页面
  8. 《软件设计模式与体系架构》课后作业解答-深绿色封面
  9. logrotate测试_如何检测 logrotate 的错误
  10. Python-统计《水调歌头·明月几时有》字符出现次数。