请问如何通过进程得到其可执行文件的路径呢

zhichizhongguo 2008-08-22 11:51:55
已使用CreateToolhelp32Snapshot,ProcessFirst32,ProcessNext32得到系统中运行的进程的名字,请问怎样才能得到各进程的可执行文件路径(.exe,也就是启动时的文件路径,非模块路径,即不是.dll文件路径)呢?论坛上问了很多人,都不会。请教。谢谢!
...全文
164 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-08-22
  • 打赏
  • 举报
回复
同上,OpenProcess、GetModuleFileNameEx。
nevergone 2008-08-22
  • 打赏
  • 举报
回复

DWORD WINAPI GetModuleFileNameEx(
__in HANDLE hProcess,
__in HMODULE hModule,
__out LPTSTR lpFilename,
__in DWORD nSize
);

nevergone 2008-08-22
  • 打赏
  • 举报
回复
看了LZ的回复
我只说一点
先学基础吧
做外挂也是要有代码基础的
我的代码肯定没有问题
在我这已经编译通过的

你的问题
看这里
http://topic.csdn.net/u/20080403/08/afbab009-ac88-49f8-a15e-47b1ff52a0db.html?926457621
zhichizhongguo 2008-08-22
  • 打赏
  • 举报
回复
此问题仍为解决,。。。!!!
zhichizhongguo 2008-08-22
  • 打赏
  • 举报
回复
9楼运行结果如下:
fatal error C1083: Cannot open include file: 'streambuf': No such file or directory.
不知怎么处理?
nevergone 2008-08-22
  • 打赏
  • 举报
回复

#include <iostream>
#include <windows.h>
#include <TLHELP32.H>

using namespace std;

typedef DWORD (__stdcall* PFGetModuleFileNameEx)(HANDLE hProcess,
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize);

PFGetModuleFileNameEx GetModuleFileNameEx;

DWORD GetQQProcessId()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnapshot == INVALID_HANDLE_VALUE)
return -1;

PROCESSENTRY32 pe;
pe.dwSize = sizeof(pe);

if (Process32First(hSnapshot, &pe))
{
do
{
if (lstrcmpi(pe.szExeFile, TEXT("qq.exe")) == 0)
{
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
} while(Process32Next(hSnapshot, &pe));
}

CloseHandle(hSnapshot);
return -1;
}

BOOL GetQQProcessPath(LPSTR pszPath, DWORD dwSize)
{
DWORD dwProcessId = GetQQProcessId();

if (dwProcessId == -1)
{
cout << "can't find qq process id" << endl;
return FALSE;
}

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);

if (hProcess == NULL)
{
cout << "can't get qq process path" << endl;
return FALSE;
}

HMODULE hPsapi = LoadLibrary(TEXT("psapi.dll"));

if (hPsapi == NULL)
{
cout << "LoadLibrary failed " << endl;
CloseHandle(hProcess);
return FALSE;
}

GetModuleFileNameEx = (PFGetModuleFileNameEx)GetProcAddress(hPsapi, "GetModuleFileNameExA");

if (GetModuleFileNameEx == NULL)
{
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}

GetModuleFileNameEx(hProcess, NULL, pszPath, dwSize);

cout << pszPath << endl;

CloseHandle(hProcess);
FreeLibrary(hPsapi);

return TRUE;
}

int main(void)
{
CHAR szPath[MAX_PATH] = { 0 };
GetQQProcessPath(szPath, MAX_PATH);
return 0;
}


手头没有VS2005,用VC6写的
在彩虹版QQ上运行可以获取QQ路径
不过如果有运行360账号保险箱,会失败
有更好的方法来获取QQ运行的路径
我就是不说:-)
cnzdgs 2008-08-22
  • 打赏
  • 举报
回复
exe也是module,用OpenProcess打开进程ID等待进程句柄,然后用GetModuleFileNameEx,第1参数给进程句柄,第2参数给NULL,第3参数给缓冲区指针,最后参数给缓冲区长度。
你先用其它进程来试,不要用QQ,据说QQ做了特殊处理,OpenProcess可能会失败。
zhichizhongguo 2008-08-22
  • 打赏
  • 举报
回复
好吧。现在请你
由我得到的进程名QQ.exe,
得到它的可执行文件路径:
C:\Program Files\Tencent\QQ\QQ.exe???
GetModualFileNameEx得不到,不信你去试。
zhichizhongguo 2008-08-22
  • 打赏
  • 举报
回复
说过了,不是Modual的路径嘛,怎么还给这个函数:GetModualFileNameEx?
MSDN
lpFilename
[out] Pointer to the buffer that receives the fully qualified path to the module. If the file name is longer than maximum number of characters specified by the nSize parameter, the file name is truncated.
得到的是模块的路径!!!
sy_hys 2008-08-22
  • 打赏
  • 举报
回复
关注
zoulie 2008-08-22
  • 打赏
  • 举报
回复
接分要趁早
Kudeet 2008-08-22
  • 打赏
  • 举报
回复
来晚了

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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