首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • [向laiyiling提问]请问如何通过进程得到其可执行文件的路径呢 [已结帖,结帖人:zhichizhongguo]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhichizhongguo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-22 11:51:55 楼主
    已使用CreateToolhelp32Snapshot,ProcessFirst32,ProcessNext32得到系统中运行的进程的名字,请问怎样才能得到各进程的可执行文件路径(.exe,也就是启动时的文件路径,非模块路径,即不是.dll文件路径)呢?论坛上问了很多人,都不会。请教。谢谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nevergone
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 12:05:491楼 得分:0
    C/C++ code
    DWORD WINAPI GetModuleFileNameEx( __in HANDLE hProcess, __in HMODULE hModule, __out LPTSTR lpFilename, __in DWORD nSize );

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      13

    发表于:2008-08-22 12:19:522楼 得分:0
    同上,OpenProcess、GetModuleFileNameEx。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laiyiling
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-08-22 16:07:393楼 得分:0
    来晚了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zoulie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:41:464楼 得分:0
    接分要趁早
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sy_hys
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:47:595楼 得分:0
    关注
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhichizhongguo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 17:57:266楼 得分:0
    说过了,不是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.
    得到的是模块的路径!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhichizhongguo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 17:59:477楼 得分:0
    好吧。现在请你
    由我得到的进程名QQ.exe,
    得到它的可执行文件路径:
    C:\Program Files\Tencent\QQ\QQ.exe???
    GetModualFileNameEx得不到,不信你去试。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      13

    发表于:2008-08-22 18:08:378楼 得分:0
    exe也是module,用OpenProcess打开进程ID等待进程句柄,然后用GetModuleFileNameEx,第1参数给进程句柄,第2参数给NULL,第3参数给缓冲区指针,最后参数给缓冲区长度。
    你先用其它进程来试,不要用QQ,据说QQ做了特殊处理,OpenProcess可能会失败。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nevergone
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 20:53:019楼 得分:100
    C/C++ code
    #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运行的路径
    我就是不说:-)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhichizhongguo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 21:09:0410楼 得分:0
    9楼运行结果如下:
    fatal error C1083: Cannot open include file: 'streambuf': No such file or directory.
    不知怎么处理?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhichizhongguo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 21:11:1711楼 得分:0
    此问题仍为解决,。。。!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nevergone
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 21:56:5912楼 得分:0
    看了LZ的回复
    我只说一点
    先学基础吧
    做外挂也是要有代码基础的
    我的代码肯定没有问题
    在我这已经编译通过的

    你的问题
    看这里
    http://topic.csdn.net/u/20080403/08/afbab009-ac88-49f8-a15e-47b1ff52a0db.html?926457621
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved