• 设定程序随windows启动


    Boot Trigger Example (C++)

    /********************************************************************
     This sample schedules a task to start Notepad.exe 30 seconds after
     the system is started. 
    ********************************************************************/
    
    #define _WIN32_DCOM
    
    #include <windows.h>
    #include <iostream>
    #include <stdio.h>
    #include <comdef.h>
    //  Include the task header file.
    #include <taskschd.h>
    #pragma comment(lib, "taskschd.lib")
    #pragma comment(lib, "comsupp.lib")
    
    
    using namespace std;
    
    int __cdecl wmain()
    {
        //  ------------------------------------------------------
        //  Initialize COM.
        HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
        if( FAILED(hr) )
        {
            printf("
    CoInitializeEx failed: %x", hr );
            return 1;
        }
    
        //  Set general COM security levels.
        hr = CoInitializeSecurity(
            NULL,
            -1,
            NULL,
            NULL,
            RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
            RPC_C_IMP_LEVEL_IMPERSONATE,
            NULL,
            0,
            NULL);
    
        if( FAILED(hr) )
        {
            printf("
    CoInitializeSecurity failed: %x", hr );
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Create a name for the task.
        LPCWSTR wszTaskName = L"Boot Trigger Test Task";
    
        //  Get the Windows directory and set the path to Notepad.exe.
        wstring wstrExecutablePath = _wgetenv( L"WINDIR");
        wstrExecutablePath += L"\SYSTEM32\NOTEPAD.EXE";
    
    
        //  ------------------------------------------------------
        //  Create an instance of the Task Service. 
        ITaskService *pService = NULL;
        hr = CoCreateInstance( CLSID_TaskScheduler,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ITaskService,
                               (void**)&pService );  
        if (FAILED(hr))
        {
              printf("Failed to create an instance of ITaskService: %x", hr);
              CoUninitialize();
              return 1;
        }
            
        //  Connect to the task service.
        hr = pService->Connect(_variant_t(), _variant_t(),
            _variant_t(), _variant_t());
        if( FAILED(hr) )
        {
            printf("ITaskService::Connect failed: %x", hr );
            pService->Release();
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Get the pointer to the root task folder.  
        //  This folder will hold the new task that is registered.
        ITaskFolder *pRootFolder = NULL;
        hr = pService->GetFolder( _bstr_t( L"\") , &pRootFolder );
        if( FAILED(hr) )
        {
            printf("Cannot get Root Folder pointer: %x", hr );
            pService->Release();
            CoUninitialize();
            return 1;
        }
        
        //  If the same task exists, remove it.
        pRootFolder->DeleteTask( _bstr_t( wszTaskName), 0  );
        
        //  Create the task builder object to create the task.
        ITaskDefinition *pTask = NULL;
        hr = pService->NewTask( 0, &pTask );
    
        pService->Release();  // COM clean up.  Pointer is no longer used.
        if (FAILED(hr))
        {
              printf("Failed to create a task definition: %x", hr);
              pRootFolder->Release();
              CoUninitialize();
              return 1;
        }
        
            
        //  ------------------------------------------------------
        //  Get the registration info for setting the identification.
        IRegistrationInfo *pRegInfo= NULL;
        hr = pTask->get_RegistrationInfo( &pRegInfo );
        if( FAILED(hr) )
        {
            printf("
    Cannot get identification pointer: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        hr = pRegInfo->put_Author(L"Author Name");
        pRegInfo->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot put identification info: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  ------------------------------------------------------
        //  Create the settings for the task
        ITaskSettings *pSettings = NULL;
        hr = pTask->get_Settings( &pSettings );
        if( FAILED(hr) )
        {
            printf("
    Cannot get settings pointer: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        //  Set setting values for the task. 
        hr = pSettings->put_StartWhenAvailable(VARIANT_TRUE);
        pSettings->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot put setting info: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
           
    
        //  ------------------------------------------------------
        //  Get the trigger collection to insert the boot trigger.
        ITriggerCollection *pTriggerCollection = NULL;
        hr = pTask->get_Triggers( &pTriggerCollection );
        if( FAILED(hr) )
        {
            printf("
    Cannot get trigger collection: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  Add the boot trigger to the task.
        ITrigger *pTrigger = NULL;
        hr = pTriggerCollection->Create( TASK_TRIGGER_BOOT, &pTrigger ); 
        pTriggerCollection->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot create the trigger: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        IBootTrigger *pBootTrigger = NULL;
        hr = pTrigger->QueryInterface( 
            IID_IBootTrigger, (void**) &pBootTrigger );
        pTrigger->Release();
        if( FAILED(hr) )
        {
            printf("
    QueryInterface call failed for IBootTrigger: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        hr = pBootTrigger->put_Id( _bstr_t( L"Trigger1" ) );
        if( FAILED(hr) )
           printf("
    Cannot put the trigger ID: %x", hr);
        
        //  Set the task to start at a certain time. The time 
        //  format should be YYYY-MM-DDTHH:MM:SS(+-)(timezone).
        //  For example, the start boundary below
        //  is January 1st 2005 at 12:05
        hr = pBootTrigger->put_StartBoundary( _bstr_t(L"2005-01-01T12:05:00") );
        if( FAILED(hr) )
           printf("
    Cannot put the start boundary: %x", hr);
      
        hr = pBootTrigger->put_EndBoundary( _bstr_t(L"2015-05-02T08:00:00") );
        if( FAILED(hr) )
           printf("
    Cannot put the end boundary: %x", hr);
    
        // Delay the task to start 30 seconds after system start. 
        hr = pBootTrigger->put_Delay( L"PT30S" );
        pBootTrigger->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot put delay for boot trigger: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        } 
           
    
        //  ------------------------------------------------------
        //  Add an Action to the task. This task will execute Notepad.exe.     
        IActionCollection *pActionCollection = NULL;
    
        //  Get the task action collection pointer.
        hr = pTask->get_Actions( &pActionCollection );
        if( FAILED(hr) )
        {
            printf("
    Cannot get Task collection pointer: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
            
        //  Create the action, specifying it as an executable action.
        IAction *pAction = NULL;
        hr = pActionCollection->Create( TASK_ACTION_EXEC, &pAction );
        pActionCollection->Release();
        if( FAILED(hr) )
        {
            printf("
    Cannot create the action: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        IExecAction *pExecAction = NULL;
        //  QI for the executable task pointer.
        hr = pAction->QueryInterface( 
            IID_IExecAction, (void**) &pExecAction );
        pAction->Release();
        if( FAILED(hr) )
        {
            printf("
    QueryInterface call failed for IExecAction: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
    
        //  Set the path of the executable to Notepad.exe.
        hr = pExecAction->put_Path( _bstr_t( wstrExecutablePath.c_str() ) ); 
        pExecAction->Release(); 
        if( FAILED(hr) )
        {
            printf("
    Cannot set path of executable: %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
          
        
        //  ------------------------------------------------------
        //  Save the task in the root folder.
        IRegisteredTask *pRegisteredTask = NULL;
        VARIANT varPassword;
        varPassword.vt = VT_EMPTY;
        hr = pRootFolder->RegisterTaskDefinition(
                _bstr_t( wszTaskName ),
                pTask,
                TASK_CREATE_OR_UPDATE, 
                _variant_t(L"Local Service"), 
                varPassword, 
                TASK_LOGON_SERVICE_ACCOUNT,
                _variant_t(L""),
                &pRegisteredTask);
        if( FAILED(hr) )
        {
            printf("
    Error saving the Task : %x", hr );
            pRootFolder->Release();
            pTask->Release();
            CoUninitialize();
            return 1;
        }
        
        printf("
     Success! Task successfully registered. " );
    
        //  Clean up.
        pRootFolder->Release();
        pTask->Release();
        pRegisteredTask->Release();
        CoUninitialize();
        return 0;
    }
  • 相关阅读:
    Java的日期类和日期格式化类
    Java中的内部类
    c#中的里氏转换和Java中强制类型转换在多态中的应用
    MySQL存储引擎
    如何控制多线程执行顺序
    为什么 1000==1000 返回为false,而 100==100 会返回为true
    HashMap和HashTable的区别
    打印昨天的当前时刻
    怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
    MyBatis中 # 和 $ 的区别?
  • 原文地址:https://www.cnblogs.com/liujx2019/p/11194822.html
Copyright © 2020-2023  润新知