很多時候,有些程序希望它開機自動運行。當然實現(xiàn)的方式有很多種,如:注冊表項、開始-程序-啟動文件夾、計劃任務、系統(tǒng)服務程序等等。
然而,計劃任務是一般用戶了解最少的一種。并且前兩種是很容易修改和通過殺毒軟件禁用的。
【This code is Task schedul 1.0 for Win XP】整理來自官網(wǎng)示例: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383581(v=vs.85).aspx
#include <windows.h>
#include
<initguid.h>
#include
<ole2.h>
#include
<mstask.h>
#include
<msterr.h>
#include
<objidl.h>
#include
<wchar.h>
#include
<stdio.h>
void
WGetUserName(WCHAR * username,
int
len)
{
//
Get and display the name of the computer.
char
szName[
255
];
ULONG nLen
=
sizeof
(szName);
::GetUserNameA(szName,
&
nLen);
for
(unsigned
int
i =
0
; i < strlen(szName); i++
)
{
username[i]
=
szName[i];
}
username[strlen(szName)]
=
'
\0
'
;
}
int
main(
int
argc,
char
**
argv)
{
HRESULT hr
=
S_OK;
ITaskScheduler
*
pITS;
///////////////////////////////////////////////////////////////
//
//
Call CoInitialize to initialize the COM library and then
//
call CoCreateInstance to get the Task Scheduler object.
///////////////////////////////////////////////////////////////
//
hr =
CoInitialize(NULL);
if
(SUCCEEDED(hr))
{
hr
=
CoCreateInstance(CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(
void
**) &
pITS);
if
(FAILED(hr))
{
CoUninitialize();
return
1
;
}
}
else
{
return
1
;
}
///////////////////////////////////////////////////////////////
//
///
Get user name of the computer
///////////////////////////////////////////////////////////////
//
WCHAR username[
512
];
memset(username,
0
,
sizeof
(username));
WGetUserName(username,
sizeof
(username));
///////////////////////////////////////////////////////////////
//
//
Call ITaskScheduler::NewWorkItem to create new task.
///////////////////////////////////////////////////////////////
//
WCHAR pwszTaskName[
512
] = L
"
Veno Server WD_TEST_
"
;
ITask
*
pITask;
wcscat(pwszTaskName, username);
hr
= pITS->NewWorkItem(pwszTaskName,
//
Name of task
CLSID_CTask,
//
Class identifier
IID_ITask,
//
Interface identifier
(IUnknown**)&pITask);
//
Address of task
//
interface
pITS
->Release();
//
Release object
if
(FAILED(hr))
{
CoUninitialize();
fprintf(stderr,
"
Failed calling NewWorkItem, error = 0x%x\n
"
,hr);
return
1
;
}
//////////////////////////////////////////////////////////////////
/
//
Call ITask::SetApplicationName to specify the Application name
//
for Test Task.
//////////////////////////////////////////////////////////////////
/
LPCWSTR pwszApplicationName = L
"
C:\\Windows\\System32\\notepad.exe
"
;
hr
= pITask->
SetApplicationName(pwszApplicationName);
if
(FAILED(hr))
{
wprintf(L
"
Failed calling ITask::SetApplicationName:
"
);
wprintf(L
"
error = 0x%x\n
"
,hr);
pITask
->
Release();
CoUninitialize();
return
1
;
}
////////////////////////////////////////////////////////////
/
//////
set flag Only if logged on
///
//
////////////////////////////////////////////////////////////
/
hr = pITask->
SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
if
(FAILED(hr))
{
wprintf(L
"
Failed calling ITask::EditWorkItem,
"
);
wprintf(L
"
error = 0x%x\n
"
,hr);
CoUninitialize();
return
1
;
}
////////////////////////////////////////////////////////////
//
set username for only for logged on
hr = pITask->SetAccountInformation( username, NULL);
//
L"NT AUTHORITY\\SYSTEM";
if
(FAILED(hr))
{
wprintf(L
"
Failed calling ITask::SetApplicationName:
"
);
wprintf(L
"
error = 0x%x\n
"
,hr);
pITask
->
Release();
CoUninitialize();
return
1
;
}
//////////////////////////////////////////////////////////////////
/
//
Call ITask::CreateTrigger to create new trigger.
//////////////////////////////////////////////////////////////////
/
ITaskTrigger
*
pITaskTrigger;
WORD piNewTrigger;
hr
= pITask->CreateTrigger(&
piNewTrigger,
&
pITaskTrigger);
if
(FAILED(hr))
{
wprintf(L
"
Failed calling ITask::CreatTrigger:
"
);
wprintf(L
"
error = 0x%x\n
"
,hr);
pITask
->
Release();
CoUninitialize();
return
1
;
}
//////////////////////////////////////////////////////
//
Define TASK_TRIGGER structure. Note that wBeginDay,
//
wBeginMonth, and wBeginYear must be set to a valid
//
day, month, and year respectively.
//////////////////////////////////////////////////////
TASK_TRIGGER pTrigger;
ZeroMemory(
&pTrigger,
sizeof
(TASK_TRIGGER));
//
Add code to set trigger structure?
pTrigger.wBeginDay =
1
;
//
Required
pTrigger.wBeginMonth =
1
;
//
Required
pTrigger.wBeginYear =
1999
;
//
Required
pTrigger.cbTriggerSize =
sizeof
(TASK_TRIGGER);
pTrigger.wStartHour
=
13
;
pTrigger.TriggerType
= TASK_EVENT_TRIGGER_AT_LOGON;
///
TASK_EVENT_TRIGGER_AT_SYSTEMSTART
pTrigger.Type.Daily.DaysInterval =
1
;
//////////////////////////////////////////////////////////////////
/
//
Call ITaskTrigger::SetTrigger to set trigger criteria.
//////////////////////////////////////////////////////////////////
/
hr
= pITaskTrigger->SetTrigger (&
pTrigger);
if
(FAILED(hr))
{
wprintf(L
"
Failed calling ITaskTrigger::SetTrigger:
"
);
wprintf(L
"
error = 0x%x\n
"
,hr);
pITask
->
Release();
pITaskTrigger
->
Release();
CoUninitialize();
return
1
;
}
//////////////////////////////////////////////////////////////////
/
//
Call IPersistFile::Save to save trigger to disk.
//////////////////////////////////////////////////////////////////
/
IPersistFile
*
pIPersistFile;
hr
= pITask->
QueryInterface(IID_IPersistFile,
(
void
**)&
pIPersistFile);
hr
= pIPersistFile->
Save(NULL,
TRUE);
if
(FAILED(hr))
{
wprintf(L
"
Failed calling IPersistFile::Save:
"
);
wprintf(L
"
error = 0x%x\n
"
,hr);
pITask
->
Release();
pITaskTrigger
->
Release();
pIPersistFile
->
Release();
CoUninitialize();
return
1
;
}
wprintf(L
"
The trigger was created and IPersistFile::Save was \n
"
);
wprintf(L
"
called to save the new trigger to disk.\n
"
);
//////////////////////////////////////////////////////////////////
/
//
Release resources.
//////////////////////////////////////////////////////////////////
/
pITask
->
Release();
pITaskTrigger
->
Release();
pIPersistFile
->
Release();
CoUninitialize();
printf(
"
Created task.\n
"
);
return
0
;
}
【The shellexce command is easy for Win 7, and task scheldul 2.0 is also right.】
VOID Win7SchTasks()
{
TCHAR Location[MAX_PATH];
TCHAR cmd[
255
];
DWORD TapLocLen
=
0
;
TapLocLen
= GetCurrentDirectory(
sizeof
(Location),Location);
if
(TapLocLen ==
0
)
{
printf(
"
GetCurrentDirectory failed! Error is %d \n
"
, GetLastError());
return
;
}
char
temp_path[MAX_PATH];
if
(!GetVenoAppPaths(temp_path,
sizeof
(temp_path)))
//這個函數(shù)的功能是得到一個可執(zhí)文件的路徑,可以自己寫或者給temp_path賦一個指定的值。
{
printf(
"
GetVenoAppPaths failed\n
"
);
return
;
}
sprintf(cmd,
"
/C schtasks /Create /tn \"Veno Server WD\" /tr \"\'%s\'\" /sc onlogon /rl HIGHEST /F
"
, temp_path);
SHELLEXECUTEINFO sei;
ZeroMemory (
&sei,
sizeof
(SHELLEXECUTEINFO));
sei.cbSize
=
sizeof
(SHELLEXECUTEINFO);
sei.lpVerb
=
"
OPEN
"
;
sei.lpFile
=
"
cmd.exe
"
;
sei.lpParameters
=
cmd;
sei.nShow
=
SW_HIDE;
sei.fMask
=
SEE_MASK_NOCLOSEPROCESS;
ShellExecuteEx(
&
sei);
WaitForSingleObject(sei.hProcess, INFINITE);
printf(
"
Write SchTasks Complete\r\n
"
);
return
;
}
因為在win XP 下ShellExecuteEx 是需要密碼才能自動啟動,它沒有2.0開機啟動的命令。而win7 有,所以這個用起來方便點,不過也因此帶來其它問題,比如要重復執(zhí)行,就要先刪除再建。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

