为什么相同进程ID却不相同???

newegg2002 2006-03-27 03:04:38
功能:
实现一定时关闭进程的工具,先由用户从进程列表中选择要结束的进程,然后得到进程ID,并在相应时间内结束此进程。
问题:
将程序运行两次,惊奇的发现列表中本属同一进程的ID在两次运行中竟然不同,请问这是为什么?应如何处理?
代码:
1. 得到进程列表的代码:
m_lcTHDLists.DeleteAllItems();

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

HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(hSnapshot, &pe);

int i=0;
CString szProcID;
CStringArray ProcLists, PriLists;
PriLists.SetSize(0,1);
ProcLists.SetSize(0,1);

do {
//TRACE("0x%x, %s", pe.th32ProcessID, pe.szExeFile);

szProcID.Format("0x%x", pe.th32ProcessID);
m_lcTHDLists.InsertItem(i,szProcID);
ProcLists.Add(pe.szExeFile);
szProcID.Format("%d",pe.pcPriClassBase);
PriLists.Add(szProcID);
i++;

} while(Process32Next(hSnapshot, &pe));
CloseHandle(hSnapshot);

for(i=0; i<ProcLists.GetSize(); i++) {
m_lcTHDLists.SetItemText(i, 1, ProcLists[i]);
m_lcTHDLists.SetItemText(i, 2, PriLists[i]);
}
2. 对进程列表控件的初始化:
m_lcTHDLists.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_lcTHDLists.InsertColumn(0, "进程ID", LVCFMT_LEFT, 70);
m_lcTHDLists.InsertColumn(1, "进程名", LVCFMT_LEFT, 150);
m_lcTHDLists.InsertColumn(2, "优先级", LVCFMT_LEFT, 60);

请大家指点一下,,这是为什么??应该如何解决??
...全文
414 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
newegg2002 2006-03-27
  • 打赏
  • 举报
回复
谢谢两位!!

不过可能是我说的不够清楚:
假设我定时关闭进程的工具名为Close.exe。 我第一次打开Close.exe发现有一个进程Xdict.exe,进程ID为 0x845, 然后我关闭Close.exe。并重新运行一次。这次却发现Xdict.exe的进程ID变为0xfc4(!=0x845).
这是为什么???

同一进程的ID在不同时间总不至于发生变化吧,,请教!!
noneone 2006-03-27
  • 打赏
  • 举报
回复
pid是动态分配的,几乎每次都不会相同,大部分软件都是根据窗口title来获取pid,可以试试FindWindow
newegg2002 2006-03-27
  • 打赏
  • 举报
回复
明白了!!!
一个傻冒 2006-03-27
  • 打赏
  • 举报
回复
进程的ID不是静态的.
是动态分配的.运行两次,ID是不会相同的.
kvls 2006-03-27
  • 打赏
  • 举报
回复
看看列表是否排序了
newegg2002 2006-03-27
  • 打赏
  • 举报
回复
谢谢 Mackz(在相互)!! 谢谢各位!!
依照Mackz(在相互)的方法,错误没有再出现。

其实我以前也是把设置列表子项的代码放到插入列表项之后去的,不过我的代码是:
do {
//TRACE("0x%x, %s", pe.th32ProcessID, pe.szExeFile);

szProcID.Format("0x%x", pe.th32ProcessID);
m_lcTHDLists.InsertItem(i,szProcID);
m_lcTHDLists.SetItemText(i,1,pe.szExeFile); //这儿参数是i,
i++;
} while(Process32Next(hSnapshot, &pe));
CloseHandle(hSnapshot);

结果程序出现了一些问题:有些列表子项没有得到设置,所以我才采用贴子中那种方法的。

我想请教:InsertItem(int nItem, LPCTSTR lpszItem)中的nItem MSDN给的解释是:
Index of the item to be inserted.
是不是可以解释成: 被插入项的索引值。那不也是当前项的索引值吗?为什么作为参数传给SetItemText会出现那种错误呢?
Stefine 2006-03-27
  • 打赏
  • 举报
回复
关注一下

不过肯定一点,用FindWindow一般可以解决此问题
菜牛 2006-03-27
  • 打赏
  • 举报
回复
你把设置列表子项的代码放到插入列表项之后去,InsertItem返回值就是插入的列表项的索引。

15,976

社区成员

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

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