#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获取进程完整路径的更多相关文章

  1. 获取进程ID,父进程ID,进程完整路径

    准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径. 要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://w ...

  2. Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结

    Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的 ...

  3. Windows 获取进程ID

    DWORD GetProcessID(const char *ProcessName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY ...

  4. 通过进程link路径(快捷方式路径)得到进程完整路径

    程序中遇到的问题及解决方法: #error WINDOWS.H already included. MFC apps must not #include <windows.h>解决方法:把 ...

  5. Linux C(++)获取可执行程序完整路径

    代码 #include <sys/statfs.h> #include <string> #include <iostream> #include <limi ...

  6. C++获取当前所有进程的完整路径

    实现代码 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <st ...

  7. Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径

    Jquery EasyUI Combotree展开所有父节点 Jquery EasyUI Combotree获取树完整路径 Jquery EasyUI tree展开所有父节点 Jquery EasyU ...

  8. Qt 扫描进程列表以及获取进程信息

    使用方法: QMap<QString,qint64> app_pid; getAllAppPidList( app_pid ); #include <tlhelp32.h>// ...

  9. 写一个Windows上的守护进程(8)获取进程路径

    写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...

随机推荐

  1. Linux代理搭建TinyProxy

    操作系统:阿里云CentOS 7.4 64位 安装方法: yum install tinyproxy 配置: vi /etc/tinyproxy/tinyproxy.conf Port 8888 // ...

  2. The walking dead

    邪恶令好人团结 Facing evil brings good people together 只是没有人觉得自己是邪恶的一边 No one ever thinks that they’re the ...

  3. pod BaiduMapKit 报错解决方案

    错误信息 [!] Error installing BaiduMapKit [!] /usr/bin/git clone https://github.com/BaiduLBS/BaiduMapKit ...

  4. hadoop mkdir: Cannot create directory /usr. Name node is in safe mode.

    今天在hdfs上面创建文件夹的时候报了:org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name ...

  5. 饮冰三年-人工智能-Python-29瀑布流

    多适用于:整版以图片为主,大小不一的图片按照一定的规律排列的网页布局. 1:创建model类,并生成数据表 from django.db import models # Create your mod ...

  6. Justoj 2388最短区间 贪心

    2388: 最短区间 Time Limit: 1 s      Memory Limit: 128 MB Submit My Status Problem Description 有M种不同颜色的气球 ...

  7. C#应用编程小例子-03-展示另一个窗体

    C#应用编程小例子-03-展示另一个窗体 using System; using System.Collections.Generic; using System.ComponentModel; us ...

  8. Istio 是什么?

    使用云平台可以为组织提供丰富的好处.然而,不可否认的是,采用云可能会给 DevOps 团队带来压力.开发人员必须使用微服务以满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部署.Istio 允 ...

  9. 判断 Python 版本

    if sys.version_info.major == 2: try: message = unicode(message, "utf-8") except UnicodeDec ...

  10. [sublime]用sublime搭建属于自己的Python的IDE

    先在sublime中利用package control下载anaconda插件, 然后更改python的路径,不知道自己anaconda的python在哪,可以在prompt用命令where pyth ...