You can also use the Task Scheduler API. Here is a sample.
Code:
#include <windows.h>
#include <initguid.h>
#include <objbase.h>
#include <mstask.h>
#include <stdio.h>
#if defined(_MSC_VER)
# pragma comment(lib, "ole32.lib")
# pragma comment(lib, "advapi32.lib")
#endif
int main(void)
{
HRESULT hr = 0;
ITaskScheduler* pITS = NULL;
ITask* pITask = NULL;
IPersistFile* pIPersistFile = NULL;
ITaskTrigger* pITaskTrigger = NULL;
TASK_TRIGGER trigger = { 0 };
WORD newTrigger = 0;
BOOL fSuccess = FALSE;
SYSTEMTIME st = { 0 };
WCHAR szUser[500];
DWORD cchUser = 500;
CoInitialize(NULL);
/* Create the task scheduler object. */
hr = CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
IID_ITaskScheduler, (void **) &pITS);
if (FAILED(hr)) goto cleanup;
/* Create a new work item. */
hr = pITS->NewWorkItem(L"Your Task Name", // Name of task
CLSID_CTask, // Class identifier
IID_ITask, // Interface identifier
(IUnknown**) &pITask); // Address of task interface
if (FAILED(hr)) goto cleanup;
/* Set the application to run (usually should include a path). */
hr = pITask->SetApplicationName(L"notepad.exe");
if (FAILED(hr)) goto cleanup;
/* Only run if the current account is logged on. */
hr = pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
if (FAILED(hr)) goto cleanup;
/* Set the user account to use. */
GetUserNameW(szUser, &cchUser);
hr = pITask->SetAccountInformation(szUser, NULL);
if (FAILED(hr)) goto cleanup;
/* Create trigger (schedule when the task should be triggered). */
hr = pITask->CreateTrigger(&newTrigger, &pITaskTrigger);
if (FAILED(hr)) goto cleanup;
/* Define TASK_TRIGGER structure. Note that wBeginDay,
* wBeginMonth, and wBeginYear must be set to a valid
* day, month, and year respectively. */
GetSystemTime(&st);
trigger.cbTriggerSize = sizeof (TASK_TRIGGER);
trigger.wBeginDay = st.wDay; // Start day
trigger.wBeginMonth = st.wMonth; // Start month
trigger.wBeginYear = st.wYear; // Start year
trigger.wStartHour = 13; // 1:00 pm
trigger.TriggerType = TASK_TIME_TRIGGER_DAILY;
trigger.Type.Daily.DaysInterval = 7; // Days between running
hr = pITaskTrigger->SetTrigger(&trigger);
if (FAILED(hr)) goto cleanup;
/* Call IUnknown::QueryInterface to get a pointer to
* IPersistFile and IPersistFile::Save to save
* the new task to disk. */
hr = pITask->QueryInterface(IID_IPersistFile, (void **) &pIPersistFile);
if (FAILED(hr)) goto cleanup;
hr = pIPersistFile->Save(NULL, TRUE);
if (FAILED(hr)) goto cleanup;
fSuccess = TRUE;
cleanup:
if (pITask) pITask->Release();
if (pIPersistFile) pIPersistFile->Release();
if (pITaskTrigger) pITaskTrigger->Release();
if (pITS) pITS->Release();
if (!fSuccess) fprintf(stderr, "Failed with error code %08x.\n", hr);
CoUninitialize();
return 0;
}