200分解决:在Win98和Win2K里用系统快照枚举所有的进程时,好像只能得到应用程序的名字,无法得到程序所在的路径,而且长一点的文件名会

jackwuwei 2004-06-29 05:13:27
我想得到长应用程序文件名的全部和路径,请问在Win98下如何实现,好像在Win2K里用SPApi.dll可以实现,但在Win98下用不了这个动态库,怎么办?
...全文
139 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnzhu 2004-06-30
  • 打赏
  • 举报
回复
在win2000和win98中可以用一种方法实现,那就是用toolhelp函数组实现,下面的例子就是。
但在winnt中要用psapi函数, 看下面函数的说明,因为win2000只得到程序名,要想得到路径,可以考虑
GetModuleFileNameEx( hProcess, hMod, sPath.GetBuffer( MAX_PATH ), MAX_PATH );

同时在98下直接取就可以了。
但的NT处理机制是用psapi所以要想用一种通用的方法,要动态载入函数,此为后话

函 数 名:FindProcessHandleAndKillInSnapShot
函数功能:在进程的内存镜象中找到指定的程序进程并且把它杀死
版 本 号:1.0
完成日期:2004/03/05
返 回 值:成功返回TRUE,否则失败返回FALSE
参 数 1:以字符串表示的程序名,如"winword.exe"
其它说明:如果同一个程序有多个实例在运行,那么将只杀死一个,注意的是这个函数只适用于Win2000系统,因为Win98下进程名还有路径
应用示例:
FindProcessHandleAndKillInSnapShot("winword.exe");
*/
BOOL FindProcessHandleAndKillInSnapShot(const CString &cs_sExeName)
{
PROCESSENTRY32 pe;
pe.dwSize=sizeof(PROCESSENTRY32);
HANDLE hProcess=NULL;
HANDLE hSnapShot;
hSnapShot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSnapShot==NULL)
{
return FALSE;//cannot get the snapshot handle
}

::Process32First(hSnapShot, &pe);

do//find the assign process name
{
CString str;
str=pe.szExeFile;
if(str.CompareNoCase(cs_sExeName)==0)
{
hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE,pe.th32ProcessID);
break;
}
}while (::Process32Next(hSnapShot, &pe));

if(hProcess==NULL)
{
//return FALSE;
}
if(::WaitForSingleObject(hProcess, 10000)!= WAIT_OBJECT_0)
{
::TerminateProcess(hProcess,0);//kill process
}

::CloseHandle(hProcess);
::CloseHandle(hSnapShot);
Sleep(5*SLEEP_TIME);
return TRUE;
}
会思考的草 2004-06-30
  • 打赏
  • 举报
回复
98下是没有这个库的。98下使用Toolhelp32库,你可以在MSDN中搜索toolhelp32。
这个,呵呵,大一时候写的,凑合着看吧:)
http://www.playicq.com/dispdocnew.php?id=4523
或者这个地址,呵呵,不知道能不能下。
ftp://new1:12345678@61.152.102.114:2100/datanew/processkiller.rar
jackwuwei 2004-06-30
  • 打赏
  • 举报
回复
问题已经搞掂,谢谢各位!给你们分。
gracezhu 2004-06-29
  • 打赏
  • 举报
回复
http://hqtech.nease.net/articles/VC_ProcessEnum.htm
carbon107 2004-06-29
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1305
这里有些例子,可以看看
比如输入对应进程的ID号
CString GetProcessPath( DWORD idProcess )
{
CString sPath;
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
idProcess );
if( NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
{
DWORD dw = GetModuleFileNameEx( hProcess, hMod, sPath.GetBuffer( MAX_PATH ), MAX_PATH );
sPath.ReleaseBuffer();
}

CloseHandle( hProcess );
}

return( sPath );
}

李马 2004-06-29
  • 打赏
  • 举报
回复
98下使用Toolhelp32函数库:Process32First、Process32Next。
如果你是希望同时支持两个系统,那么建议你使用函数指针的方法来调用Psapi一族函数。

你可以参考我的一个进程管理器(支持98和2K):
http://home.ncust.edu.cn/~titilima/download/july.zip

15,471

社区成员

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

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