如何获取正在运行的其他程序的绝对路径

afterruins 2009-03-25 07:49:45
加精
如题!
我是这样写的:

TheWindow = ::FindWindow( NULL, "abc");
::GetWindowThreadProcessId( TheWindow, &nProcessID );
hProcessHandle =::OpenProcess( PROCESS_TERMINATE,FALSE, nProcessID );
EnumProcessModules(hProcessHandle, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcessHandle, hModule, path, sizeof(path));


不知道为什么不行!
...全文
2384 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
StonesHeart 2012-03-15
  • 打赏
  • 举报
回复
受益了。
babyhome 2011-05-28
  • 打赏
  • 举报
回复
正在学习windows编程当中...大家分享出好多的方法啊
visualassist4680 2010-04-20
  • 打赏
  • 举报
回复
openprocess 需要提权,
deletefile 不需要提权,删除失败, 做个循环,循环内 deletefile; sleep(200);直到成功或者超时
ahead_8 2009-12-01
  • 打赏
  • 举报
回复
mark
zhanshen2891 2009-03-30
  • 打赏
  • 举报
回复
WaitForSingleObject(hProcessHandle,INFINITE);
以后再sleep(500);
基本就可以了

程序退出以后句柄释放的并不会那么快
yy0591 2009-03-29
  • 打赏
  • 举报
回复
有些真强
sobug 2009-03-29
  • 打赏
  • 举报
回复
留名,学习
tutu08 2009-03-27
  • 打赏
  • 举报
回复
windows编程
慢慢学习
LichKing 2009-03-27
  • 打赏
  • 举报
回复
study();
JPEXE 2009-03-27
  • 打赏
  • 举报
回复
试试用这个函数来删除文件


//-----------------------------------------------------------------------------------------------------------
// 函数: DelFileEx
// 功能: 删除指定文件, 并在指定时限内不断重试.
// 参数: [in] const TCHAR* ptszFile - 需要被删除的文件路径.
// [in] DWORD dwRetry = 0 - 重试时间间隔(毫秒), 默认为 0 毫秒, 将无间隔不断重试.
// [in] DWORD dwTimeout = 1000 - 超时限制(毫秒), 超过该时间将放弃重试, 默认为 1000 毫秒.
// 返回: bool - 删除成功返回 true, 否则返回 false.
// 说明: 若在重试期间删除成功, 则立即停止重试而返回成功(true).
// 若指定文件路径无效则直接返回失败(false).
// 若指定文件本来就不存在则直接返回成功(true).
//-----------------------------------------------------------------------------------------------------------
bool DelFileEx(const TCHAR* ptszFile, DWORD dwRetry /* = 0 */, DWORD dwTimeout /* = 1000 */)
{
// 检查文件路径是否有效
if (NULL == ptszFile || 0 == _tcslen(ptszFile))
{
return false;
}

// 检查文件是否存在
HANDLE hFile = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA wfd;

hFile = ::FindFirstFile(ptszFile, &wfd);
if (INVALID_HANDLE_VALUE == hFile)
{
return true;
}

// 准备删除文件
bool isSucceed = false;
DWORD dwStart = 0; // 开始时刻(毫秒)

// 记录开始时刻
dwStart = ::GetTickCount();

while (true)
{
// 尝试删除
if (::DeleteFile(ptszFile))
{
isSucceed = true;
break;
}

// 判断超时
if (dwTimeout <= ::GetTickCount() - dwStart)
{
break;
}

// 等待间隔
::Sleep(dwRetry);
}

return isSucceed;
}
gauge 2009-03-27
  • 打赏
  • 举报
回复
尝试一下
magie711 2009-03-27
  • 打赏
  • 举报
回复
大家都好厉害啊~~~我不行啊啊
pengpzy 2009-03-27
  • 打赏
  • 举报
回复
学习了,
jyh_baoding 2009-03-26
  • 打赏
  • 举报
回复
hehe
cnzdgs 2009-03-26
  • 打赏
  • 举报
回复
补充一下,用VC加载程序时,由于VC的进程已经提升了SeDebugPrivilege权限,子进程继承了该权限,所以不需要处理。
cnzdgs 2009-03-26
  • 打赏
  • 举报
回复
OpenProcess失败了吧?在调用OpenProcess之前需要调用AdjustTokenPrivileges提升SeDebugPrivilege权限。
bbschen1988 2009-03-26
  • 打赏
  • 举报
回复
好东西值得一看啊
mashang 2009-03-26
  • 打赏
  • 举报
回复
每个api后面跟个getlasterror,输出看看

问题可能发生在:
1 权限
2 某些函数被hook。
3 被delete的文件被其他进程open了

先getlasterror看看把
wangmchun23 2009-03-26
  • 打赏
  • 举报
回复
#include <psapi.h>
#pragma comment(lib,"psapi")
char drpath[MAX_PATH]={NULL};
HWND xl = FindWindow(NULL,"迅雷5");
DWORD procId;
GetWindowThreadProcessId(xl,&procId);
HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS,false,procId);
GetModuleFileNameEx(proc,NULL,drpath,MAX_PATH);
xisat 2009-03-26
  • 打赏
  • 举报
回复
BOOL KillWindow(LPCWSTR wintitle)
{
HWND fhWnd=FindWindow(NULL,wintitle);
if (fhWnd!=NULL)
{
DWORD PID;
GetWindowThreadProcessId(fhWnd,&PID);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
if(hProcess)
{
HMODULE hModule;
DWORD dwsize;
if(EnumProcessModules(hProcess,&hModule,sizeof(hModule),&dwsize))
{
TCHAR path[MAX_PATH];
if(GetModuleFileNameEx(hProcess,hModule,path,sizeof(path))>0)
{
DWORD exitcode;
if(TerminateProcess(hProcess,4))
{
do
{
GetExitCodeProcess(hProcess,&exitcode);
printf("\r\n0x%X",exitcode);
}
while(exitcode==STILL_ACTIVE);
if(DeleteFile(path))
wprintf(L"\r\nDelete %s Success ProcessID %d",path,PID);
else
getlasterr(L"DeleteFile",GetLastError());
KillWindow(wintitle);//递归继续查找同名窗口
}
else getlasterr(L"TerminateProcess",GetLastError());

}
else getlasterr(L"GetModuleFileNameEx",GetLastError());
}
else getlasterr(L"EnumProcessModules",GetLastError());
CloseHandle(hProcess);
}
else getlasterr(L"OpenProcess",GetLastError());

}
else printf("\r\nCan't Find '%S'",wintitle);
return FALSE;
}
加载更多回复(24)

15,471

社区成员

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

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