ページ 11

[c++]タスクスケジューラの登録済みタスクに対する操作(実行、終了)

Posted: 2016年2月18日(木) 10:52
by ny
こんにちは。nyです。

件名の通り、c++からタスクスケジューラへの操作ができません。

環境
・windows10(x64)
・vs2015 vc++ (Debug x86)
・(とりあえず)コンソールアプリケーション
・vs2015は管理者権限で起動

プログラムは下記URLをサンプルとして使用しました。
lpcwszTaskNameのタスク名は登録済みのタスク名に変更してそれぞれ実行してみましたが
実現したい結果を得られませんでした。

タスク実行
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
タスク終了
https://msdn.microsoft.com/en-us/librar ... s.85).aspx

実行してもエラーにはなりませんでしたが、
hr = pITS->Activat
のhrの結果が
「HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) : 指定されたファイルが見つかりません。 」
となります。

調べてはみたのですが、上手くいきません。。。
最悪、コマンドをbatファイルを用意してタスク操作も考えてはいますが、
タスクのStatusで判断したいこともあり、可能な限りPG内で済ませたいと考えています。

Re: [c++]タスクスケジューラの登録済みタスクに対する操作(実行、終了)

Posted: 2016年2月19日(金) 02:18
by yuni
こんばんわ。
タスクスケジューラに登録したタスクなら生存している限りは
問題なく取得できるはずなのですが…なんでしょうね。

スケジューラに登録する側が何かのタイミングでターミネイトされているのでしょうか?
試しにスケジューラに登録する側のアプリケーションに
スケジューラ登録直後にActiveで取得できるかテストするとか、
アプリケーション終了直前にActiveで取得できるかテストするとか、
色々テストのやり方はあると思いますよ。

コードの一部でもいいので載せていただければ
誰か何かわかるかもしれません…

Re: [c++]タスクスケジューラの登録済みタスクに対する操作(実行、終了)

Posted: 2016年2月19日(金) 10:51
by ny
yuni様

ご回答ありがとうございます。

MSが公開しているサンプルでタスクスケジューラにタスクを登録するものもあったので
試しに新規ソリューション、プロジェクトをコンソールで作成した後に
リンク先のコードをそのまま貼り付けて実行してみました。(最初投稿した実行、終了も同様)

タスクに登録すると思われるサンプル
https://msdn.microsoft.com/en-us/librar ... s.85).aspx

実行したら滞りなく処理はすべて完了し、
もう一度実行したら
「HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) : ファイルがあります。 」
となり、登録されたようです。

が、実際にタスクスケジューラにサンプルソースのタスク名である「Test Task」が見当たりません。

もしかして自身が根本的に勘違いしている部分があるのでしょうか。。

この実行結果を受けて思うのは
このサンプルから登録されるタスクスケジューラは
また別に管理されているタスクスケジューラに対して行われているような印象を受けます。

Windows10(x64)と(x86)でタスクスケジューラの管理が違うとかそういうのはあるのでしょうか。
system32とSysWow64のどちらともの「taskschd.msc」を起動してみてはみたのですが、
「Task Test」は登録されておらず、ほかのタスクは全て登録内容は一致しています。

ますます分からなくなりました。

Re: [c++]タスクスケジューラの登録済みタスクに対する操作(実行、終了)

Posted: 2016年2月20日(土) 20:37
by yuni
こんばんわ。

Runをしていないので、これは実際には何も起きていないのでは…?と思います。
私も同じコードを実行してみましたが、ファイルが保存されただけのようでしたよ。
ny さんが書きました: タスクに登録すると思われるサンプル
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
このサンプルはタスクに登録できるワークアイテムを作り出し、
ワークアイテムからインターフェイスを取得後に
pIPersistFileクラスで情報を抽出、セーブしているサンプルのように思います。
pIPersistFile->GetCurFile で、ファイルの場所は判明するかと。

実際にこれをActivateで取得(というかタスクファイルの確認?)ができたのであれば、
一番初めの投稿にあった、「タスク実行」などのサンプルのように、
タスクを実行(Run関数の呼び出し)させてみてはどうでしょうか?
問題なく実行出来ますか?

ちなみに私もサンプルコピーしてやってみましたが、
私のところでは必要なプロパティが設定されていない、という理由でタスクの実行が失敗しました。(なぜだろう…)
オフトピック
私もタスク周りはそこまで詳しくはないので、調べつつの対応になってます。
正確ではないのでnyさんには申し訳ない…。
どこか間違いがあれば補足してくださる方がいると嬉しいです。