Windows获取进程完整路径
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib") BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)
{
TCHAR szDriveStr[];
TCHAR szDrive[];
TCHAR szDevName[];
INT iDevName;
INT i; //检查参数
if (!pszDosPath || !pszNtPath)
return FALSE; //获取本地磁盘所有盘符,以'\0'分隔,所以下面+4
if (GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
{
for (i = ; szDriveStr[i]; i += )
{
if (!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))
continue; //从C盘开始 //盘符
szDrive[] = szDriveStr[i];
szDrive[] = szDriveStr[i + ];
szDrive[] = '\0';
if (!QueryDosDevice(szDrive, szDevName, ))//查询 Dos 设备名(盘符由NT查询DOS)
return FALSE; iDevName = lstrlen(szDevName);
if (_tcsnicmp(pszDosPath, szDevName, iDevName) == )//是否为此盘
{
lstrcpy(pszNtPath, szDrive);//复制驱动器
lstrcat(pszNtPath, pszDosPath + iDevName);//复制路径 return TRUE;
}
}
} lstrcpy(pszNtPath, pszDosPath); return FALSE;
}
//获取进程完整路径
BOOL GetProcessFullPath(DWORD dwPID)
{
TCHAR szImagePath[MAX_PATH];
TCHAR pszFullPath[MAX_PATH];
HANDLE hProcess;
if (!pszFullPath)
return FALSE; pszFullPath[] = '\0'; hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, , dwPID); //由线程ID获得线程信息
if (!hProcess)
return FALSE; if (!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH)) //得到线程完整DOS路径
{
CloseHandle(hProcess);
return FALSE;
}
if (!DosPathToNtPath(szImagePath, pszFullPath)) //DOS路径转NT路径
{
CloseHandle(hProcess);
return FALSE;
} CloseHandle(hProcess); _tprintf(_T("%5d %s \r\n"), dwPID, pszFullPath);
return TRUE;
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "chs"); //不设置解析中文字符时可能会出问题
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); //得到系统所有线程快照
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return NULL;
}
PROCESSENTRY32 pe = { };
pe.dwSize = sizeof(PROCESSENTRY32); BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) //遍历
{
GetProcessFullPath(pe.th32ProcessID);
}
return ;
}
为什么要使用setlocal呢(非本例)
在 VC2005 中 std::fstream 的打开文件的函数实现里,传入的 char const* 文件名作为多字节首先被mbstowcs 转换成宽字节后,再转发给 Unicode 版本的 API 进行实际的打开文件操作
_MRTIMP2_NCEEPURE FILE *__CLRCALL_PURE_OR_CDECL _Fiopen(const char *filename, ios_base::openmode mode, int prot)
{ // open wide-named file with byte name wchar_twc_name[FILENAME_MAX]; if (mbstowcs_s(NULL, wc_name, FILENAME_MAX, filename,FILENAME_MAX - 1) != 0)
return ();
return _Fiopen(wc_name, mode, prot);
}
问题的关键在于,对于 mbstowcs 函数来说,它需要知道多字节的编码类型才能正确的将其转换成宽字节的 unicode,很可惜这个编码类型并没有体现在函数的参数列表里,而是隐含依赖全局的 locale 。更加不幸的是,全局 locale 默认没有使用系统当前语言,而是设置为没什么用处的 "C" locale 。于是 GBK 编码的文件名在 "C" locale 下转换错误
在本机上vs2017运行本例时出现了无法打印中文字符串的现象
Windows获取进程完整路径的更多相关文章
- 获取进程ID,父进程ID,进程完整路径
准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径. 要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://w ...
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
Atitit,通过pid获取进程文件路径 java php c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的 ...
- Windows 获取进程ID
DWORD GetProcessID(const char *ProcessName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY ...
- 通过进程link路径(快捷方式路径)得到进程完整路径
程序中遇到的问题及解决方法: #error WINDOWS.H already included. MFC apps must not #include <windows.h>解决方法:把 ...
- Linux C(++)获取可执行程序完整路径
代码 #include <sys/statfs.h> #include <string> #include <iostream> #include <limi ...
- C++获取当前所有进程的完整路径
实现代码 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <st ...
- Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径
Jquery EasyUI Combotree展开所有父节点 Jquery EasyUI Combotree获取树完整路径 Jquery EasyUI tree展开所有父节点 Jquery EasyU ...
- Qt 扫描进程列表以及获取进程信息
使用方法: QMap<QString,qint64> app_pid; getAllAppPidList( app_pid ); #include <tlhelp32.h>// ...
- 写一个Windows上的守护进程(8)获取进程路径
写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...
随机推荐
- go实现选择排序
package main import "fmt" func SelectSort(data []int) { length := len(data) for i := 0; i ...
- I/O多路复用之select、poll、epoll
很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segm ...
- 【原创】大叔经验分享(50)hue访问mysql(librdbms)
cloudera manager安装hue后想开启访问mysql(librdbms)需要在这里配置(hue_safety_valve.ini) 添加配置如下 [librdbms] # The RDBM ...
- echarts-map-区县
首先通过百度获取经纬度 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...
- Eclipse:An error has occurred. See error log for more details. java.lang.NullPointerException
问题描述 在使用 Eclipse Clean 项目时报错:An error has occurred. See error log for more details. java.lang.Null ...
- struts2-剩余
一.说明 类型转换.输入验证(前台和后台)(validate().validateXXX().xml) 标签.上传下载.i18n(国际化).ognl(#reqeust.name) 注解方式.log4j ...
- cmake编译opencv时指定cuda版本
之前有网友提问说,基于cmake编译时如果切换cuda版本,比如我同时装了cuda8和cuda9,opencv总是找到cuda9,我想用cuda8怎么办?实际上,手头上要配置的工程是基于opencv3 ...
- 微信域名检测的C#实现
背景:最近公司的公众号域名被封了,原因是公司网站被黑后上传了一个不符合微信规范的网页.所以...就进入了微信域名解封的流程. 百度微信域名解封发现很多微信域名检测的网站,还有Api:但是本人做微信公 ...
- 网站发布出现“未能找到路径“path\bin\roslyn\csc.exe”....“和拒绝访问的解决办法
最近在2017上新建了一个MVC项目,发布是出现了各种奇怪的问题,其中一个错误是: 未能找到路径“path\bin\roslyn\csc.exe”.... 经过网上搜寻资料发现罪魁祸首就是NUGET里 ...
- Django----使用模板系统渲染博客页面、实现列表和详情页的跳转、前后跳转功能
.模板写法同Flask,可以参考之前的FLask-模板 .将之前的BootStrap静态页面中的数据使用模板写 <!DOCTYPE html> <html lang="en ...