void
CSwitchDlg::OnSTB1()
{
PROCESS_INFORMATION
pi
if(OpenSTB(1,&pi)==TRUE)
{
m_List.SetItemText(0,2,_T("关机"))
CString
pid
pid.Format(_T("%d"),pi.dwProcessId)
m_List.SetItemText(0,1,pid.GetBuffer())
m_Btn1.EnableWindow(FALSE)
m_Pid[0]=pi.dwProcessId
m_hSTB[0]=OpenProcess(PROCESS_QUERY_INFORMATION,0,m_Pid[0])
}
}
BOOL
CSwitchDlg::OpenSTB(int
nSTB,PROCESS_INFORMATION*
pi)
{
if(!m_Path.GetLength())
{
AfxMessageBox(_T("机顶盒在哪里?请指明路径..."))
return
FALSE
}
STARTUPINFO
si
memset(&si,0,sizeof(si))//若不清0,那么将包含主调线程栈上的垃圾数据
si.cb=sizeof(si)
si.wShowWindow=SW_SHOW
si.dwFlags=STARTF_USESHOWWINDOW
CString
cmd
cmd.Format(_T("STB%d"),nSTB)
if(CreateProcess(m_Path,
cmd.GetBuffer(),NULL,FALSE,NULL,NULL,NULL,NULL,&si,pi))
{
CloseHandle(pi->hProcess)
CloseHandle(pi->hThread)
//关闭到子进程的主线程内核对象的句柄
return
TRUE
}
else
{
MessageBox(_T("打开机顶盒失败,请选择正确的路径"))
return
FALSE
}
}
我这个代码是从一个进程中打开另一个进程。你可以模仿一下
。
下面是遍历系统中正在运行的进程的
代码:
PROCESSENTRY32
pe32
pe32.dwSize
=
sizeof(pe32)
//创建进程快照
HANDLE
hProcessSnap
=
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
0)
BOOL
bMore
=
Process32First(hProcessSnap,
&pe32)
//遍历系统中运行的进程
while(bMore)
{
//在这里做你想做的事情
}
随便看到你提的这个问题.如果是读取内存,你直接读就行了.关键是范围和具体的位置问题.
如果进程是指定的,直接openprocess,....然后....再....去读就行了.
if pId!=NULL 这个过程可以省了.擦除,也不用了.我不知道我的理解对不对,如果你是想达到结束进程的效率,我可以明确告诉你,不要这么做.你应该从系统的内存管理机制入手.
对于,找托盘栏图标的HWND,用Findwindow不是 最好的办法.用托盘struct比较好.
如果非要用Findwindow,你可以试一下.先: FindWindow(NULL,...)得到顶层桌面的HWND,再用FindWindowEx从父级一层一层往下面找.
你有我的百度HI吧,有什么不明白的,直接联系吧.
每个进程的虚拟地址空间都要划分成各个分区。地址空间的分区是根据 *** 作系统的基本实现方法来进行的。不同的windows内核,其分区也略有不同。你在用户级就只能访问用户级的地址
32位Windows 2000的用户地址空间范围是0 x 0 0 0 1 0 0 0 0 0 - x B F F E F F F F F
你定义一个指针指向这个范围的任意位置都是可以访问的。
C/C++ code
HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId())
LPVOID lpBaseAddress=(LPVOID)0x190BA
DWORD dwValueif(!::ReadProcessMemory(hProcess,lpBaseAddress,&dwValu¡
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)