首页 > 编程语言 >C++修改任务计划程序-电源条件

C++修改任务计划程序-电源条件

时间:2024-07-03 17:33:26浏览次数:19  
标签:std cout FAILED hr variant 电源 C++ 修改 Release

  1. 介绍
    应用程序需要进行守护,又不想另外运行一个软件去实时监测应用程序是否退出了,退出就重启。在Windows上可以利用任务计划程序,达到守护进程的作用。
  2. 创建任务计划
    在nsis脚本中可以直接使用schtasks命令来创建任务计划,以下是每分钟检测一次的脚本。
    nsExec::ExecToLog 'schtasks /create /tn "${PRODUCT_NAME}" /tr "\"$INSTDIR\ILink.exe\" -schtasks" /sc MINUTE /mo 1 /f' ;创建计划任务
  3. 问题
    使用schtasks命令行创建的任务计划,会在笔记本电脑未接通电源的情况下失效。失效原因为,任务计划中的条件项中的电源条件导致了失效
  4. 解决方案
    schtasks命令无法修改电源选项,故使用C++制作了一个小程序由nsis脚本中调用来关闭电源条件。
    以下是C++实现代码部分:
// SQTool.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _WIN32_DCOM
#include <iostream>
#include<comdef.h>
#include<wincred.h>
#include<taskschd.h>
#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "credui.lib")
using namespace std;

int wmain(int argc, WCHAR** argv)
{
        if (argc <= 1)
        {
                std::cout << "请输入正确的参数" << std::endl;
                return 1;
        }
        WCHAR* taskName = argv[1];
        std::wcout << L"任务名称为:" << taskName << std::endl;
        std::cout << "开始修改条件->电源-[只有在计算机使用交流电时才启动此任务]-[如果计算机改用电池电源,则停止]" << std::endl;
        std::cout << "设置->如果任务运行时间超过以下时间,停止任务" << std::endl;
        HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
        if (FAILED(hr))
        {
                std::cout << "CoInitializeEx failed:" << hr << std::endl;
                return 1;
        }
        hr = CoInitializeSecurity(
                NULL,
                -1,
                NULL,
                NULL,
                RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
                RPC_C_IMP_LEVEL_IMPERSONATE,
                NULL,
                0,
                NULL);
        if (FAILED(hr))
        {
                std::cout << "CoInitializeSecurity failed:" << hr << std::endl;
                return 1;
        }
        LPCWSTR wszTaskName = taskName;

        ITaskService* pService = nullptr;
        hr = CoCreateInstance(CLSID_TaskScheduler,
                NULL,
                CLSCTX_INPROC_SERVER,
                IID_ITaskService,
                (void**)&pService);
        if (FAILED(hr))
        {
                std::cout << "Failed to create an instance of ITaskService:" << hr << std::endl;
                return 1;
        }
        hr = pService->Connect(_variant_t(), _variant_t(),
                _variant_t(), _variant_t());
        if (FAILED(hr))
        {
                std::cout << "ITaskService:Connect failed:" << hr << std::endl;
                pService->Release();
                CoUninitialize();
                return 1;
        }
        ITaskFolder* pRootFolder = nullptr;
        hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);
        if (FAILED(hr))
        {
                std::cout << "Canot get root folder pointer:" << hr << std::endl;
                pService->Release();
                CoUninitialize();
                return 1;
        }
        IRegisteredTask* pRegisteredTask = nullptr;
        hr = pRootFolder->GetTask(taskName, &pRegisteredTask);
        if (FAILED(hr))
        {
                std::cout << "GetTask fail:" << hr << std::endl;
                return 1;
        }
        ITaskDefinition* pTaskDefinition = nullptr;
        hr = pRegisteredTask->get_Definition(&pTaskDefinition);
        if (FAILED(hr))
        {
                std::cout << "get_Definition fail:" << hr << std::endl;
                return 1;
        }
        ITaskSettings* pTaskSettings = nullptr;
        hr = pTaskDefinition->get_Settings(&pTaskSettings);
        if (FAILED(hr))
        {
                std::cout << "get_Settings fail:" << hr << std::endl;
                return 1;
        }
        pTaskSettings->put_DisallowStartIfOnBatteries(false);
        pTaskSettings->put_StopIfGoingOnBatteries(false);
        pTaskSettings->put_ExecutionTimeLimit(_bstr_t(L"PT0H"));
        hr = pRootFolder->RegisterTaskDefinition(
                _bstr_t(wszTaskName),
                pTaskDefinition,
                TASK_CREATE_OR_UPDATE,
                _variant_t(),
                _variant_t(),
                TASK_LOGON_INTERACTIVE_TOKEN,
                _variant_t(L""),
                &pRegisteredTask);
        if (FAILED(hr))
        {
                std::cout << "RegisterTaskDefinition fail:" << hr << std::endl;
                return 1;
        }
        pTaskSettings->Release();
        pTaskDefinition->Release();
        pRegisteredTask->Release();
        pRootFolder->Release();
        pService->Release();
        std::cout << "设置结束" << std::endl;
}

  1. 参考文档
    文档

标签:std,cout,FAILED,hr,variant,电源,C++,修改,Release
From: https://www.cnblogs.com/zzr-stdio/p/18282244

相关文章

  • 新特性之C++14
    C++14是C++11的一个增量升级版本,虽然没有引入像C++11那样的大量新特性,但它通过对已有特性进行优化和扩展,提高了语言的可用性和性能。本文将详细介绍C++14引入和优化的新特性功能。概述C++14旨在修复C++11的一些缺陷,并提供了一些重要的增强功能,以简化开发者的日......
  • 修改主机名和IP的映射关系
    1.vim/etc/hosts,输入:127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6192.168.137.131node1192.168.137.132node2192.168.137.133node3然后cat/etc/hos......
  • Oracle归档目录修改
    一.概要Oracle安装好后,把存档终点设置为USE_DB_RECOVERY_FILE_DEST,所以归档日志默认是保存在oracle系统的闪回恢复区(Flashrecoveryarea)的。默认的db_recovery_file_dest是2G,所以一般建议将存档终点修改为操作系统的适当目录查看归档目录SQL>archiveloglist;以上为归......
  • 电源测试DCDC
    测试项目 1.输出纹波  2.动态响应Transient3.负载调整率LoadRegulation4.JitterVdsSpikeMOS管的Vds电压效率Efficency开机电源波形RiseTime&OverShootFallTime&UnderShoot下电波形OCPSCPOVP 时序PowerSequency线性调整率LineRegula......
  • PointCloudLib alpha shapes算法提取平面点云边界 C++版本
    测试效果算法简介AlphaShapes算法是一种用于提取平面点云边界特征的方法,以下是对其原理和步骤的详细解释:1.AlphaShapes算法概述目标:从点云数据中提取曲面边界信息,通过计算点云中点的Alpha形状,获得边界特征。Alpha形状:一个可以描述几何体边界的参数。其计算基于一......
  • 如何批量修改文件名?4个简单的方法
    在日常工作和学习中,我们经常需要处理大量的文件,并对这些文件的命名进行统一管理。但是,手动逐个修改文件名不仅效率低下,还容易出错。因此,掌握批量修改文件名的技巧变得尤为重要。下面将介绍四种简单的方法,帮助你轻松实现批量修改文件名。如何批量修改文件名?4个简单的方法方法......
  • 使用CMD命令.修改为Win 7传统右键菜单模式
    @echoofftitleH之尘.右键菜单%窗口标题%:menucolor02clsecho~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~echo~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~echo欢迎使用H之尘脚本echo.echo请选择项目():echo.&echo【1】修改为Win7传统右键菜单模式echo.&e......
  • 如何批量修改PPT文件名?批量修改文件名的四个方法在这里
    在日常工作中,我们经常需要处理大量的PPT文件。然而,随着项目的增多和时间的推移,PPT文件的命名往往变得杂乱无章,给查找和使用带来了极大的不便。因此,掌握给PPT文件批量重命名的方法显得尤为重要。本文将详细介绍4种简单有效的PPT文件批量重命名方法,帮助您轻松管理PPT文件。方法......
  • 基于C++类与权限初识:银行系统
    功能:银行的账户是一个模板,是一个类,有存款人信息和账户额度,而具体的存款人视为一个对象,一个对象不能私自修改账户额度,需要通过一个操作流程,比如去ATM或者柜台进行操作才能修改到账户额度,所以,存款人信息和账户额度设计成私有权限,通过公有的操作流程,也就是公有函数去操作私有......
  • 聊聊C++20的三向比较运算符 `<=>`
    C++20标准引入了许多新特性,其中之一是三向比较运算符<=>,也被称为太空船运算符。这个新运算符为C++程序员提供了一种全新的比较对象的方式,它能有效简化比较逻辑,避免编写多个比较运算符重载的情况。为什么需要三向比较运算符?在C++20之前,如果要完整地定义一个类型的比较行为......