现在的位置: 首页 > 综合 > 正文

wince下的进程相关操作

2013年10月04日 ⁄ 综合 ⁄ 共 1990字 ⁄ 字号 评论关闭

作者:小马


今天移植一个函数到wince下,函数的功能不复杂,就是遍历系统中所有的进程,直到找到要找到的进程并把它结束掉. 就是移植这样一个简单的函数,却遇到了很多问题. 当然移植成功后也学到了.

原来的程序是在vc写的,VC下实现上述功能用的是psapi.dll里EnumProcesses等一系列的函数, 枚举系统中所有的进程,找到要找结束的那个进程,并调用TerminateProcess结束它. 在移植过程中我发现. Wince并不支持psapi.dll,当然它里面的一些接口函数也肯定不能用. 网上查了一下,发现toolHelp.lib下有几个函数可以实现上述功能,最主要的是它们能在wince下使用. 这几个函数是

HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,
DWORD th32ProcessID)

 

BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)

 

BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)

原理就是第一个函数获取当前进程的快照句柄, 然后用后两个函数遍历, 找到相应的进程并结束它. 具体每个函数的用法大家可以查msdn. 我在这里只说这遇到问题.

首先就是toolhelp.lib找不到. 通过查msdn我看到上面三个函数是要toolhelp.lib库支持的. 于是我就在evc-project-link-object/modules下面加上了toolhelp.lib这个库但是在EVC编译出错:

cannot open input file 'toolhelp.lib'

我估计是装SDK时没有把这个文件装上去,去SDK的安装目录看了一下,果然在lib文件夹下没有找到这个文件. 肯定是定制系统内核时没有把相应的组件加上. 去wince的帮助文档查了一下,了解到toolhelp.lib的支持应该加上toolhelp组件. 打开PB,找到了这个组件. 如下图所示.

 

 

 

加上这个组件,重新编译一个内核, 然后生成一个新的SDK, 以上问题解决. 下面把关键代码贴出来:

       HANDLE hProcessSnap;

       PROCESSENTRY32 pro32;

       pro32.dwSize = sizeof(PROCESSENTRY32);//dwSize must be set before calling process32First.

 

       hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

       if (hProcessSnap == INVALID_HANDLE_VALUE)

       {

              MessageBox(TEXT("snapShot process failed!"));

              return;

       }

 

       BOOL bNext = ::Process32First(hProcessSnap, &pro32);

       while (bNext)

       {

              if ( wcscmp(pro32.szExeFile, TEXT("myProcess.exe")) == 0 )

              {

                     break;

              }

              bNext = ::Process32Next(hProcessSnap, &pro32);

       }

       if (bNext)//找到该进程

       {

              HANDLE hProcess = ::OpenProcess(0, FALSE, pro32.th32ProcessID);

              if (hProcess == NULL)

              {

                     MessageBox(TEXT("获取进程失败"));

                     return;

              }

 

              DWORD exitCode;

              if (::GetExitCodeProcess(hProcess, &exitCode) != 0)

              {

                     ::TerminateProcess(hProcess, exitCode);//结束进程.

              }

       }

       ::CloseToolhelp32Snapshot(hProcessSnap);

 

抱歉!评论已关闭.