工控机需要在某一时刻自动重起,并且无人干预,没有显示器,怎样实现?希望高手指教。

解决方案 »

  1.   

    下面是我的一个工程中的代码:
    //显示不同的文本
    CString GetPromptText(UINT uID)
    {
    switch(uID)
    {
    case EWX_LOGOFF:
    return "是否注销?";
    break;
    case EWX_FORCE:
    return "是否终止所有应用程序,这可能会造成数据丢失?";
    break;
    case EWX_FORCEIFHUNG: 
    return "是否终止所有应用程序?";
    break;
    case EWX_POWEROFF:
    return "是否关闭电源?";
    break;
    case EWX_REBOOT:
    return "是否重新启动计算机?";
    break;
    case EWX_SHUTDOWN:
    return "是否关闭系统?";
    break;
    } return "";
    }
    //重新启动计算机
    BOOL AfxExitSystem(UINT uFlags, UINT uAddition)
    {
    CString str;
    switch(uFlags)
    {
    case EWX_LOGOFF:
    case EWX_FORCE:
    case EWX_FORCEIFHUNG:
    switch(uAddition)
    {
    case EWX_NOPROMPT:
    return ::ExitWindowsEx(uFlags, 0);
    break;
    case EWX_PROMPT:
    str = GetPromptText(uFlags);
    if(AfxMessageBox(str, MB_OKCANCEL) == IDOK)
    {
    return ::ExitWindowsEx(uFlags, 0);
    }
    break;
    }
    break;
    case EWX_POWEROFF:
    case EWX_REBOOT:
    case EWX_SHUTDOWN:
    HANDLE hTokenUsed;
    TOKEN_PRIVILEGES tpPrevious;
    TOKEN_PRIVILEGES tp;
    DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES);
    LUID luid;
    //获得进程访问句柄
    if(::OpenProcessToken(::GetCurrentProcess(), 
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenUsed))
    {
    //根据指定的进程权利获得本地唯一标识符
    if(::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid ))
    {
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    //调整进程权利
    if(::AdjustTokenPrivileges(hTokenUsed, FALSE, &tp,
    sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious))
    {
    str = GetPromptText(uFlags);
    if(AfxMessageBox(str, MB_OKCANCEL) == IDOK)
    {
    return ::ExitWindowsEx(EWX_REBOOT, 0);
    }
    else
    {
    ::AdjustTokenPrivileges(hTokenUsed, FALSE, &tpPrevious,
    sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious);
    ::CloseHandle(hTokenUsed);
    }
    }
    }
    }
    break;
    } return FALSE;
    }