环境:win10  64位操作系统   VS2012编程  
代码如下:
头文件
#include "stdafx.h"
#include "GetprocessPath.h"
#include "GetprocessPathDlg.h"
#include "afxdialogex.h"
#include <Psapi.h>
#include "tlhelp32.h"
#pragma comment (lib,"Psapi.lib")主要源代码void CGetprocessPathDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码 CString processFullPath;
CString processname1=_T("CCProjectMgr.exe");
GetProcessidFromName(processname1,processFullPath);//由进程名获取进程路径
AfxMessageBox(processFullPath);//显示进程路径
CDialogEx::OnOK();
}
//-------------------------------获取进程路径函数-----------------------------------------------//
DWORD CGetprocessPathDlg::GetProcessidFromName(CString processName,CString &processPath){
PROCESSENTRY32 pe;
MODULEENTRY32 me;
//LPMODULEENTRY32 me;
DWORD id=0;
HANDLE mehandle;
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize=sizeof(PROCESSENTRY32);
BOOL ret=Process32First( hSnapshot,&pe);
if(!ret)
return 0;
while(1)
{
pe.dwSize=sizeof(PROCESSENTRY32);
if(Process32Next(hSnapshot,&pe)==FALSE)
break;
if(processName.CompareNoCase(pe.szExeFile)==0)
{
id=pe.th32ProcessID;
CString myfilename;
myfilename=pe.szExeFile;
AfxMessageBox(myfilename);
mehandle=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,id);
me.dwSize=sizeof(MODULEENTRY32);
Module32First(mehandle,&me);
processPath=me.szExePath;
    AfxMessageBox(GetLastError());//测试问题
break;
}
}
CloseHandle(hSnapshot);
return id;
}问题:
编绎的后运行程序,获取路径空或未初始化。获取最后错误显示,但在调试时显示路径正常。获取最后错误显示
Debug  Assertion Failed!
Program:C:\WINDOWS\SYSTEM32\mfc110ud.dll
File:f\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appui1.cpp
line:162
For information on how your program can causr an assertion failure,see the visual c++ documentation on asserts
小弟菜鸟一个,求高人指点!

解决方案 »

  1.   

    运行的时候当前目录是exe所在路径。你是否处理正确
      

  2.   

    C:\Program Files (x86)\xxx\xxxx.exe  这种64位兼容32系统都有空格,测试与空格无关。
      

  3.   

    补充说明:
    由于在调试模式运行程序时无任何问题,刚开始以为在权限上有问题,在项目属性--链接器--清单文件UAC级别设置成requireAdministrator (/level='requireAdministrator'),运行时依然存在问题。看来与权限无关。也用过GetProcessImageFileName/EnumProcessModule等函数来获取都不成功。有点奇怪的是有一两交居然能正常运行。今天晚上用网上64位32位进程路径获取办法(DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)和GetProcessFullPath(DWORD dwPID, TCHAR pszFullPath[MAX_PATH])在DOS下查看全部路径,居然没有我要的进程。因此我更换另一个进程来获取,次次都能正常获取全路径,获取这个程序路径时显示如图路径(空),百思不得其解。如果它加密,应该也不能通过 任务栏进程列表,通过点击右键看到路径,而且偶尔能获取正确的路径。求高人指点。
      

  4.   

    使用tlist命令行工具。
      

  5.   

    赵4老师:
    tasklist这个命令能查看到进程名称,我用程序也能获取名称,但就是无法获取路径,能告诉我是什么原因导致的吗?
      

  6.   

    tlist和tasklist不是一回事!
      

  7.   

    最近再做逆向汇编学习是,发现该进程为系统进程,用AdjustProcessToken()调整进程权限即可,在用VS调试时由于获取的是调试权限,所以能正常显示路径。谢谢各位老师回复。