作者:小马
今天移植一个函数到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);