获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName
http://blog.csdn.net/bichenggui/article/details/4774457
--------------------------------------------------
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName
想获得进程可执行文件的路径通常有三个方法:
一: 调用GetModuleFileNameEx函数获得可执行文件的模块路径这个函数从Windows NT 4.0开始到现在的Vista系统都能使用,向后兼容性比较好。
二:调用GetProcessImageFileName函数,这个函数在Windows XP及其以后的系统中都能使用。
三:调用Windows Vista新增的函数QueryFullProcessImageName,由于是Vista新增的,所以兼容性不好。
下面来看看这三个函数的原型:
DWORD GetModuleFileNameEx(HANDLE hProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize)
hProcess是目标进程的句柄、hModule是目标模块的句柄(当此参数为NULL时函数返回的是进程可执行文件的路径)、lpFilename是 存放路径的字符串缓冲区、nSize表示缓冲区的大小。函数调用失败将返回0。注:进程的句柄须有PROCESS_QUERY_INFORMATION和 PROCESS_VM_READ权限。
DWORD GetProcessImageFileName(HANDLE hProcess,LPTSTR lpImageFileName,DWORD nSize)
hProcess是目标进程的句柄、lpImageFileName是存放路径的字符串缓冲区、nSize表示缓冲区的大小。函数失败将返回0。注:进程句柄需要有PROCESS_QUERY_INFORMATION的权限。
BOOL QueryFullProcessImageName(HANDLE hProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize)
hProcess是目标进程的句柄、dwFlags一般设为0(表示返回的路径是Win32的路径格式,如"C:/...",如将其设为 PROCESS_NAME_NATIVE将返回"/Device/HarddiskVolume1/..."这样的格式路径)、lpExeName是存放 路径的字符串缓冲区、lpdwSize表示缓冲区的大小。函数失败将返回FALSE。注:调用此函数的句柄须有 PROCESS_QUERY_INFORMATION或这是PROCESS_QUERY_LIMITED_INFORMATION的权限,并且只能在 Vista或更高版本的系统中使用。
调用GetModuleFileNameEx和GetProcessImageFileName需要包含Psapi.h头文件,并链接到Psapi.lib
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
GetProcessImageFileName获取进程路径
HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pe.th32ProcessID);
if ( GetProcessImageFileName(hProcess,szFilePath,MAX_PATH)!=0 ){
mystring strFilePath = CCommon::DosDevicePath2LogicalPath(szFilePath);
}
复制代码
DosDevicePath2LogicalPath代码摘自:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/fileio/fs/obtaining_a_file_name_from_a_file_handle.htm
mystring CCommon::DosDevicePath2LogicalPath(LPCTSTR lpszDosPath)
{
mystring strResult;
// Translate path with device name to drive letters.
TCHAR szTemp[MAX_PATH];
szTemp[0] = '\0';
if ( lpszDosPath==NULL || !GetLogicalDriveStrings(_countof(szTemp)-1, szTemp) ){
return strResult;
}
TCHAR szName[MAX_PATH];
TCHAR szDrive[3] = TEXT(" :");
BOOL bFound = FALSE;
TCHAR* p = szTemp;
do{
// Copy the drive letter to the template string
*szDrive = *p;
// Look up each device name
if ( QueryDosDevice(szDrive, szName, _countof(szName)) ){
UINT uNameLen = (UINT)_tcslen(szName);
if (uNameLen < MAX_PATH)
{
bFound = _tcsnicmp(lpszDosPath, szName, uNameLen) == 0;
if ( bFound ){
// Reconstruct pszFilename using szTemp
// Replace device path with DOS path
TCHAR szTempFile[MAX_PATH];
_stprintf_s(szTempFile, TEXT("%s%s"), szDrive, lpszDosPath+uNameLen);
strResult = szTempFile;
}
}
}
// Go to the next NULL character.
while (*p++);
} while (!bFound && *p); // end of string
return strResult;
}
http://www.cnblogs.com/-clq/archive/2012/03/14/2395564.html
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName的更多相关文章
- ip地址+进程端口号+路径参数同样实现restful访问
1.ip地址+进程端口号+路径参数同样实现restful访问 2. 我:还有个问题,龙哥,ip地址+端口+路径参数,也能实现restful访问吧,:可以 我:好我:所以,我只要访问,服务器ip地址+n ...
- bat wmic python 获取进程的所在路径
bat wmic python 获取进程的所在路径 doc: wmic process where name="process-name" get executablepath w ...
- C++获取当前所有进程的完整路径
实现代码 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <st ...
- readlink 获取进程的绝对路径
readlink可以获取exe所在的路径(直接和进程关联);无法获得so的路径,so路径可以用dladdr,参考另一篇文章linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所 ...
- centos下通过pid查看进程的绝对路径的方法
例如: 我想要知道我执行中的mysql路径 netstat -nlp pid拿到15330,然后 cd /proc/15330 由于linux在启动一个进程时,会在/proc下创建一个以PID命名的文 ...
- Linux-查看进程的完整路径
通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等.这时,我们需要通过以下的方法来查看进程的详细信息:Linux在启动一个进程时,系统会在/proc下创建一个以 ...
- 内核中通过进程PID获取进程的全部路径
目录 一丶简介 二丶原理 1.原理 2.代码实现. 一丶简介 我们遇到的Dos路径.如果想转化为NT路径(也就是 C:\xxxx)类似的格式 需要自己实现. 具体原理如下: 二丶原理 1.原理 1.使 ...
- Linux查看进程的启动路径——pwdx
想要找到transfer的启动路径. 一般是ps -ef | grep keyward 但是这个刚好是没有用绝对路径执行. 再用pwdx pid获得
- 如何使用C++获取 进程的 绝对路径
DWORD GetProcessId(IN PCHAR szExeName) { DWORD dwRet = 0; DWORD dwCount = 0; HANDLE hSnapshot = Crea ...
随机推荐
- 经典SQL语句大全之提升
二.提升 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)法一:select * into b from a where 1<>1(仅用于SQlServer)法 ...
- Qt 学习之路:Qt 简介
Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个“一站式”的解决方案:不再需要研究 S ...
- objective-c IBOutletCollection介绍
objective-c IBOutletCollection介绍 将UI控件和源码进行链接时,方法的表示方法是IBAction,控件属性对象是IBOutlet.如果想将一个同类型的UI控件作为一个组放 ...
- Linux PATH变量的设置
一般Linux系统,有两个配置文件可以设置PATH变量,一:.bashrc 二:.bash_profile; 还有一种方法可以临时设置PATH变量(三) 一: 1.编辑.bashrc,添加 expo ...
- 第九篇:python高级之操作数据库
python高级之操作数据库 python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...
- VS中监视窗口,即时窗口和输出窗口的使用
一.监视窗口 1.配置应用程序,使应用程序处于调试状态. 2.点击“调试”----“窗口”----“监视”----“监视1”,打开监视窗口. 3.在监视窗口中“名称”栏中输入变量名称或html元素id ...
- VS2010调试时候未响应
这几天使用vs2010,调试时候经常未响应,等了半天才缓过来,严重影响心情,决定解决这个问题. 搜寻一番,试着关闭VS,重新设置了vs2010的环境(在vs2010命令提示符下,执行devenv.ex ...
- Angularjs总结(六) 上传附件
所用插件:angular-file-upload 这个插件用到的几个指令:nv-file-select(点击选择).uploader(用于绑定控制器中新建的uploader对象) HTML: < ...
- Java compile时,提示 DeadCode的原因
在工程编译时,编译器发现部分代码是无用代码,则会提示:某一行代码是DeadCode.今天compile工程的时候发现某一个循环出现这个问题,如下: public void mouseOver(fina ...
- Html5-Canvas实现简易的抽奖转盘
###Html5实现抽奖转盘效果 1.实现的基本效果 2.主要的内容 html5中canvas标签的使用 jQueryRotate.js旋转插件 3.主要html代码 <body> < ...