描述:
我的vc程序因为需要不间断的运行,所以老板要求给它作一个看门狗程序,这样在它出错或异常的时候可以关掉重启.现在我非常困惑的是怎样才能在看门狗程序中及时捕捉到vc程序的出错,怎样关掉出错的程序,然后重启计算机,输入用户名密码?上述这些关闭重启输入密码等操作都要在看门狗程序中解决而不能靠手动.哪位高手指点一下吧
解决方案1:
重启自动登录帮你专一个吧
NT的这里看看,主要是修改注册表中的AutoAdminLogon及相关的东西。
http://www.mhdn.net/o/2001-12-16/6375.html
如何在Windows NT中激活自动登录
出自:http://www.ccidnet.com 2001-12-16
本文章的信息适用于:Microsoft Windows 2000 Professional
摘要
Windows通过在注册数据库中储存你的代码和其它相关信息允许你去自动操作登录过程。
更多的信息
这个特性允许其它使用者启动你的计算机并且使用你建立的报告来自动地登录。
要点:虽然自登录可以使运用Windows 2000变得更简便,但是这个特性是一个安全危机。
设置一个计算机允许自登录意味着能够接触到计算机的任何人能够访问本计算机所有内容,潜在地包括任何网络或者与它相连的网络。另一个危机是启动自登录导致密码储存在注册表内,在明码文本中。这个特殊的存储了这个值的注册表可以被Authenticated Users组远程地阅读。
结果这个设置只适用于计算机不容易被接触的情况,并且采取一些步骤来确保不被信任的用户不能远程访问注册表。
用注册表编辑器(Regedt32.exe)来增加你的登录信息,如下:
警告:错误地使用注册表编辑器能够导致严重的、多方面的系统问题,这些问题都是可能需要你重新安装Windows NT来纠正的。微软不可能保证来自注册表编辑器使用的任何问题都被解决。在你处于危险时,请使用这个工具
1.启动REGEDT32.EXE和定位下面注册表的子密钥:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon
2.使用你的报告名字和密码,双击DefaultUserName条目,键入你的名字,并且点击ok。点击DefoultPassword条目,键入你的密码,然后点击ok。
注意:DefoultPassword值可能不存在。如果它不存在,那么从编辑菜单中,选择Add Value。在Value Name区域,键入"DefaultPassword"(没有引号)。选择REG_SZ适合于数据类型。在String区域,键入你的密码。存储你的改变。
同样,如果没有DefaultPassword字符串指定,那么Windows NT自动改变AutoAdminLogon键值,从1 (对)变到0 (错)。这样解除了AutoAdminLogon特性。
3.从编辑菜单中,选择Add Value。在Value Name区域加入AutoAdminLogon、选择PEG_SZ适合于数据类型。在String区域加入1。存储你的改变。
4.退出REGEDT32。
5.点击Start,点击Shutdown,然后点击ok。关闭你的计算机。
6.重新启动你的计算机和Windows NT。你应该能够自动登录。
注意:为了绕过AutoAdminLogon过程,并且作为一个不同的用户登录,可以在注销或者Windows NT重新启动之后,按住SHIFT键。
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon
Value: ForceAutoLogon
Type: REG_SZ
Data: 1
1。先来解决第一个问题如何判断 系统出错:
A.函数错误,这是指函数返回值产生错误,你根据这个发现系统出现异常无法,继续运行,只能退出;那么这就需要你在判断出这类错误之后,调用重新启动API(我记不清名字了,自己查一下吧)或是直接重新启动守护的进程也可以
B.Win异常错误,比如除数为0,指针访问异常等等 这个就需要在 Thread的 函数当中加入Win32结构化异常处理代码如下:
ThreadProc(LPVOID pParam)
{
_try
{
//线程内主干代码
}__except(EXCEPTION_EXECUTE_HANDLER)
{
//关闭进程 ,这个如果采用 TerminateProcess 直接结束进行,在后面你就可以通过判断
//Mutex的释放情况 来分别进程是异常退出 还是正常退出,但是这种方法会产生内存泄露,
//如果采用通知主控制对象自动退出, 那么这种情况你就在 把一个标志存入文件,或是注册表
//供狗来判断是什么情况下退出.
//直接添加重新启动计算机的代码
}
}
2。如何判断进行退出,这有很多种方法:
我下面介绍一种,这种方法也适用如果判断一个进行已经运行
在进程的一个开始加入:
HANDLE g_Handle = CreateMutex(0,TRUE,_T("_0MY_SERVER_RUNING0_"));
if(g_Handle)
{
int v_nError = GetLastError();
if(ERROR_ALREADY_EXISTS == v_nError)
{
return -1;
}
}
这样一来如果进行退出,v_Handle就不存在,我们可以根据这种来判断进程是否还在运行当中,还有就是最后进行正常退出时,必忘记把这个对象释放,关闭了.
在狗中代码如下:
HANDLE v_hProcessMutex = OpenMutex(STANDARD_RIGHTS_READ,FALSE,"_0MY_SERVER_RUNING0_");
if(!v_hProcessMutex)
{
//Open失败说明进程不存在了,需要重启计算机或是直接重新启动进程
}else
{
DWORD dwRet = 0;
for(;;)
{
dwRet = WaitForSingleObject(v_hProcessMutex,1000/*1秒*/);
if(dwRet == WAIT_ABANDONED)
{
//这种情况进程异常退出,没有通过正常的途径释放Mutex就关闭了。
//重启计算机或是重新启动进程
break;
}else if(dwRet == WAIT_OBJECT_0)
{
//进程正常退出
break;