关于根据程序名称找到程序的完整路径的问题!(急)

yushulei 2008-02-14 03:41:46
想通过程序名称查找当前运行的程序,如果存在就得到其保存路径,然后关闭它并重启此程序。但目前碰到一个难题,就是在查到期进程信息后,只能得到进程ID、名称、和HANDLE句柄,本想通过GetModuleFileName得到其完整路径的,但第一个参数HMODULE 得不到,GetModuleHandle只能得到dll的HMODULE句柄,不能得到exe的,忙了一整天也找不到解决的办法,急啊!还请各位大哥大姐指教啊!
...全文
217 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-02-14
  • 打赏
  • 举报
回复
知道LZ的问题在哪了——是OpenProcess的权限没给对。
yushulei 2008-02-14
  • 打赏
  • 举报
回复
太感谢jingzhongrong 和zhoujianhei了,问题已经解决,zhoujianhei的更贴近我的代码,唉,我怎么就没想到这个呢!
太谢谢诸位了,马上结贴!
jingzhongrong 2008-02-14
  • 打赏
  • 举报
回复
我试过了可以的
BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName);

int main(void)
{
DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];
HANDLE hToken;
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{
if (EnablePrivilege(hToken,SE_DEBUG_NAME))
{
EnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);
for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameExA(hProcess, hModule, path, sizeof(path));
printf("%s\n",path);
}
}
}
}
CloseHandle(hProcess);
CloseHandle(hModule);
getchar();
return 0;
}
zhoujianhei 2008-02-14
  • 打赏
  • 举报
回复

HANDLE hProcessSnap =NULL;
PROCESSENTRY32 pe32 ={0};
BOOL bLable =false;
hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == (HANDLE)-1)
{
return false;
}
pe32.dwSize =sizeof(PROCESSENTRY32);

if(Process32First(hProcessSnap,&pe32))
{
do
{
CString strName ="";
strName.Format("%s",pe32.szExeFile);
if(strName == strProcessName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId);
MODULEENTRY32 me = { sizeof(me) };
Module32First(hSnapshot, &me);
CString sPath = me.szExePath;
}

}
while(Process32Next(hProcessSnap,&pe32));
}
else
{
CloseHandle(hProcessSnap);
return bLable;
}
yushulei 2008-02-14
  • 打赏
  • 举报
回复
to:cnzdgs :
试过了,但还是不行,返回值都是空。

我马上在试下jingzhongrong 的方法。
多谢各位了!
jingzhongrong 2008-02-14
  • 打赏
  • 举报
回复

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
return( (GetLastError()==ERROR_SUCCESS) );
}

cnzdgs 2008-02-14
  • 打赏
  • 举报
回复
如果你只想取EXE文件的完整路径,用我在9楼提的方法就可以。
yushulei 2008-02-14
  • 打赏
  • 举报
回复
试了楼上各位仁兄的方法还是不行,我把这段代码贴出来请大家帮忙看下吧:
HANDLE hProcessSnap =NULL;
PROCESSENTRY32 pe32 ={0};
BOOL bLable =false;
hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == (HANDLE)-1)
{
return false;
}
pe32.dwSize =sizeof(PROCESSENTRY32);

if(Process32First(hProcessSnap,&pe32))
{
do
{
CString strName ="";
strName.Format("%s",pe32.szExeFile);
if(strName == strProcessName)
{
HANDLE hProc =NULL;
hProc=OpenProcess(
SYNCHRONIZE|PROCESS_TERMINATE, TRUE,
pe32.th32ProcessID);

TCHAR chFileName[256];
HMODULE hMod;
CString strPath ="";
// hMod =GetModuleHandle("KWatch.exe");//mplayerc.exe
// hMod =GetModuleHandle("kernel32.dll");
hMod =GetModuleHandle("mplayerc.exe");
// hMod =GetModuleHandle("");
DWORD needed =0;
EnumProcessModules(hProc,&hMod,sizeof(hMod),&needed);
GetModuleFileNameEx(hProc,hMod,chFileName,256);
// GetModuleFileName(hMod,chFileName,256);
}

}
while(Process32Next(hProcessSnap,&pe32));
}
else
{
CloseHandle(hProcessSnap);
return bLable;
}

to jingzhongrong :

EnumProcessModules(hProc,&hMod,sizeof(hMod),&needed);调用后,hMod仍然为空,返回错误是拒绝访问,估计是权限问题,但不知道怎么解决!
jingzhongrong 2008-02-14
  • 打赏
  • 举报
回复
szExePath应该只有进程名……
zhoujianhei 2008-02-14
  • 打赏
  • 举报
回复
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId);
MODULEENTRY32 me = { sizeof(me) };
Module32First(hSnapshot, &me);
CString sPath = me.szExePath;
cnzdgs 2008-02-14
  • 打赏
  • 举报
回复
GetModuleFileNameEx第1参数给目标进程句柄,第2参数给NULL。
jingzhongrong 2008-02-14
  • 打赏
  • 举报
回复
这回看见了……
jingzhongrong 2008-02-14
  • 打赏
  • 举报
回复
怎么回的贴不见了……

用GetModuleFileNameEx
句柄可以通过进程ID使用OpenProcess获得


hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid);
if (hProcess)
{
EnumProcessModules(hProcess,&hModule,sizeof(hModule),&needed);
GetModuleFileNameEx(hProcess,hModule,path,sizeof(path));
}
用户 昵称 2008-02-14
  • 打赏
  • 举报
回复
噢,看错了。
jingzhongrong 2008-02-14
  • 打赏
  • 举报
回复
GetModuleFileNameEx
获得进程ID,然后通过OpenProcess获得句柄

大概

hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processID);
if(hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
}
用户 昵称 2008-02-14
  • 打赏
  • 举报
回复
__argv[ 0 ]
yushulei 2008-02-14
  • 打赏
  • 举报
回复
我要得到的不是自身程序的路径,而是其他程序的路径,比如我在自身程序里遍历到暴风影音进程(mplayerc.exe),我需要把它给重启一下,这时候就碰到我帖子上说的问题了!
GetModuleFileNameEx这个也一样碰到我所说的问题啊!得不到HMODULE句柄
cnzdgs 2008-02-14
  • 打赏
  • 举报
回复
GetModuleFileNameEx
  • 打赏
  • 举报
回复
参数填NULL就是了

lpModuleName
[in] Pointer to a null-terminated string that contains the name of the module (either a .dll or .exe file). If the file name extension is omitted, the default library extension .dll is appended. The file name string can include a trailing point character (.) to indicate that the module name has no extension. The string does not have to specify a path. When specifying a path, be sure to use backslashes (\), not forward slashes (/). The name is compared (case independently) to the names of modules currently mapped into the address space of the calling process.
If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧