|
分類:[C/C++]
元々のやりたいことはログイン時に管理者権限でEXEを起動したいのですが
スタートアップフォルダにいれても起動できないのでタスクスケジューラー
から起動することにしました。
そこでセットアップからタスクスケジューラーに追加したいと思い
カスタムアクション(C++)で下記処理をいれました。
最後までエラーにならず通るものの、タスクスケジューラの一覧に追加されません。
試しに手動で同名のタスクを追加したところ追加できてしまう状態です。
つまり、見えてないのではなく、追加されていないのだと思います。
ちなみにOrcaでmsiを確認するとCustomActionテーブルのTypeには「3073」が
入っているので管理者権限としてカスタムアクションは動いていると
思うのですが…。
何が悪いのかわからずに困っている状況です。
アドバイスをいただけると助かります。
よろしくお願いいたします。
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
static BOOL CreateSchTask(CString execPath)
{
HRESULT hr = ERROR_SUCCESS;
ITaskScheduler *pITS;
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(void **) &pITS);
if (FAILED(hr))
{
CoUninitialize();
return FALSE;
}
}
else
{
return FALSE;
}
//タスク作成
LPCWSTR pwszTaskName;
pwszTaskName = L"StartupTest";
ITask *pITask;
hr = pITS->NewWorkItem(pwszTaskName, CLSID_CTask, IID_ITask, (IUnknown**)&pITask);
pITS->Release();
if (FAILED(hr))
{
CoUninitialize();
return FALSE;
}
//実行プログラム設定
pITask->SetApplicationName(execPath);
//トリガー作成
ITaskTrigger* pITaskTrig = NULL;
WORD wTrigNumber = 0;
hr = pITask->CreateTrigger(&wTrigNumber, &pITaskTrig);
if (FAILED(hr))
{
pITask->Release();
CoUninitialize();
return FALSE;
}
//スケジュール設定
TASK_TRIGGER rTrigger;
ZeroMemory(&rTrigger, sizeof(TASK_TRIGGER));
rTrigger.cbTriggerSize = sizeof(TASK_TRIGGER);
rTrigger.TriggerType = TASK_EVENT_TRIGGER_AT_LOGON;
rTrigger.wBeginYear = 2004;
rTrigger.wBeginMonth = 4;
rTrigger.wBeginDay = 10;
rTrigger.wStartHour = 10;
rTrigger.wStartMinute = 0;
hr = pITaskTrig->SetTrigger(&rTrigger);
pITaskTrig->Release();
if (FAILED(hr))
{
pITask->Release();
CoUninitialize();
return FALSE;
}
IPersistFile *pIPersistFile = NULL;
hr = pITask->QueryInterface(IID_IPersistFile,
(void **)&pIPersistFile);
pITask->Release();
if (FAILED(hr))
{
CoUninitialize();
return FALSE;
}
hr = pIPersistFile->Save(NULL, FALSE);
pIPersistFile->Release();
if (FAILED(hr))
{
CoUninitialize();
return FALSE;
}
CoUninitialize();
return TRUE;
}
|