WinXP下如何获得进程的全路径?
PROCESSENTRY32结构之中的szExeFile可以在98之中显示进程的全路径,但是在XP之下就不能了。请问诸位高手,如何获得进程的全路径?谢谢! 问题点数:50、回复次数:17Top
1 楼titi_lima(titilima(李马)的马甲.net)回复于 2003-09-02 21:58:44 得分 0
唉,顶Top
2 楼COKING(天晴)回复于 2003-09-02 22:55:57 得分 0
AfxGetApp()->m_pszExeName;Top
3 楼Kyle_Chen()回复于 2003-09-02 23:16:31 得分 1
char szPath[_MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), szPath, _MAX_PATH);Top
4 楼masterz(www.fruitfruit.com)回复于 2003-09-02 23:43:08 得分 1
void GetProcessName(DWORD processid,LPTSTR buf,int len)
{
//make sure buf is valid and long enough
if(buf==NULL||len<=0)
return;
buf[0]=0;
if(processid ==8)
{
_tcscpy(buf,"System");
return;
}
if(processid==0)
{
_tcscpy(buf,"System Idle Process");
return;
}
HANDLE hProcess =OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,processid);
if(hProcess ==NULL)
{
_tcscpy(buf,"unknown(OpenProcess error)");
return;
}
HMODULE hModule;
DWORD cbReturned;
BOOL bret=EnumProcessModules(hProcess ,&hModule, sizeof(hModule), &cbReturned );
if(bret)
{
DWORD dwret=GetModuleFileNameEx(hProcess ,hModule,buf,len);
//GetModuleBaseName(hProcess,hModule,buf,len);
}
else
_tcscpy(buf,"unknown(GetModuleBaseName error)");
CloseHandle( hProcess ) ;
// GetProcessName2(processid,buf);
}Top
5 楼howtotell(从何谈起)回复于 2003-09-03 07:50:53 得分 1
Masterz的程序的代码在98下编译不过,即使在2k下编译过了在2K下执行也是出错.我试过.Top
6 楼yh824()回复于 2003-09-03 09:05:40 得分 30
我最近作了各类似的: (我是获得若干进程的全路径,主要用到CreateToolhelp32Snapshot和GetModuleFileNameEx,path就是全路径,你自己把不要的去掉就可以了)
HANDLE hSnapShot = NULL, hExeFile = NULL;
BOOL bRet = FALSE ;
CString show ;
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot == INVALID_HANDLE_VALUE)
return bRet;
PROCESSENTRY32 info ;
info.dwSize = sizeof(info);
if(Process32First(hSnapShot, &info))
{
if(GetLastError() == ERROR_NO_MORE_FILES )
{
AfxMessageBox("没有进程信息 !") ;
CloseHandle(hSnapShot);
return bRet ;
}
else
{
CString ExeFile, ExePath;
char path[255] ;
memset(path, 0, sizeof(path)) ;
int nCount = arry.GetSize() ;
int nIndex = 0 ;
int pos = 0 ;
for (int i = 0; i < nCount; i++)
{
nIndex = arry.GetAt(i) ;
ExeFile = m_csArry.GetAt(nIndex)->name ;
ExePath = ExeFile ;
pos = ExeFile.ReverseFind('\\') ;
pos = ExeFile.GetLength() - pos - 1 ;
ExeFile = ExeFile.Right(pos) ;
while (Process32Next(hSnapShot, &info))
{
if (ExeFile == info.szExeFile)
{
hExeFile = OpenProcess(PROCESS_ALL_ACCESS, FALSE, info.th32ProcessID);
if(hExeFile != NULL)
{
GetModuleFileNameEx(hExeFile, (HMODULE)(info.th32ModuleID), path, 255) ;
if (ExePath == path)
{
TerminateProcess(hExeFile, 0);
m_list2.SetItemText(nIndex, 1, "未运行") ;
m_list2.SetItemText(nIndex, 2, "") ;
m_csArry.GetAt(nIndex)->flag = false ;
break ;
}
}
}
}
}
bRet = TRUE ;
}
}
else
{
AfxMessageBox(" 系统错误 !") ;
}
CloseHandle(hSnapShot);
return bRet ;Top
7 楼yinx(新星知我心)回复于 2003-09-03 09:06:27 得分 0
GetModuleFileName 不行么
Top
8 楼titi_lima(titilima(李马)的马甲.net)回复于 2003-09-03 20:16:13 得分 0
Toyh824(啾啾虫):
为什么在MSDN中可以找到GetModuleFileNameEx,而我的VC 6.0不能使用?Top
9 楼Oversense(步步文)回复于 2003-09-03 20:53:11 得分 0
要包含头文件才可以用GetModuleFileNameExTop
10 楼titi_lima(titilima(李马)的马甲.net)回复于 2003-09-03 20:56:35 得分 0
To Oversense(步步文):
哪个头文件?我用Find in files...找过了,没找到哦。
谢谢!Top
11 楼ppyy()回复于 2003-09-03 21:08:06 得分 10
Requirements
Windows NT/2000: Requires Windows NT 4.0 or later.
Header: Declared in Psapi.h.
Library: Use Psapi.lib.
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000.
Top
12 楼yh824()回复于 2003-09-04 09:57:46 得分 1
哦,是这样,#include "psapi" 就OK了Top
13 楼yh824()回复于 2003-09-04 09:58:54 得分 1
#include "psapi.h", 呵呵~Top
14 楼titi_lima(titilima(李马)的马甲.net)回复于 2003-09-04 10:58:43 得分 0
谢谢诸位热心的解答,我的VC 6.0并没带有psapi.h和psapi.lib,我从VS.net 2003中复制了一份,运行正常。但是仍然无法获得那些系统服务(如svchost.exe等)的全路径,请问如何解决?Top
15 楼titi_lima(titilima(李马)的马甲.net)回复于 2003-09-04 22:23:04 得分 0
请大家帮忙!如果分不够可以另开贴加分!Top
16 楼yh824()回复于 2003-09-05 08:58:09 得分 5
后台服务进程事受到操作系统保护的,出于安全性和稳定性的考虑,如果你只通过正常途径是不大可能让你获得他的句柄。Top
17 楼titi_lima(titilima(李马)的马甲.net)回复于 2003-09-05 13:11:44 得分 0
OK,那谢谢了,结贴。Top




