タスクスケジューラでの起動

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 582
登録日時: 9年前
住所: 宮崎県

タスクスケジューラでの起動

#1

投稿記事 by dic » 7年前

http://dixq.net/forum/viewtopic.php?f=3&t=12050 の続きです

タスクスケジューラで起動すると、現在のディレクトリがシステムのディレクトリになるのはわかったので
タスクスケジューラに対応させようと思うのですが、どう考えてもロジックが思いつきません

ツール.exe を起動して、ツールと同じディレクトリから「設定.txt」を読み込んで
作業ディレクトリを設定しようかと思っているんですが

手動で、ツール.exe を起動すると 同じディレクトリの「設定.txt」が読み込まれます
ので、手動だと問題ないのです

しかし、タスクスケジューラで起動すると ツール.exe を起動すると、システムディレクトリの「設定.txt」を
探すことになり、そこに「設定.txt」はないので、作業ディレクトリが設定できません

これを書いてて思ったのは、システムディレクトリに「設定.txt」を置けばいいんじゃないか?と思いますが、
インストール形式になって、あまり、詳しくないのでいじれないです
1kのテキストを置くだけなので、ほとんど問題ないと思ってますが、アンインストールとかが、どうやって
つくればいいのか?とか、未知の世界です


つまり、ツール.exe をタスクスケジューラから起動して、ツール.exeと同じディレクトリにある「設定.txt」を
どうやって読み込ませれるのでしょうか?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: タスクスケジューラでの起動

#2

投稿記事 by YuO » 7年前

タスクスケジューラということで Windows 専用で。

GetModuleFileName API の第一引数に nullptr を渡せば,現在実行しているプログラムのフルパスが得られます。
あとはパスを弄る API でフルパスを作り出せば良いです。

コード:

#include <windows.h>
#include <shlwapi.h>
#include <string>

#ifdef __MSVC
#pragma comment(lib, "shlwapi")
#endif

std::wstring get_setting_file_name ()
{
    wchar_t buf[MAX_PATH];
    ::GetModuleFileNameW(nullptr, buf, sizeof(buf) / sizeof(buf[0]));
    ::PathRemoveFileSpecW(buf);
    ::PathAppendW(buf, L"設定.txt");
    return buf;
}
のような感じでしょうか。
# デバッグしていない上にエラー処理をしていないので,ちゃんと処理をする必要があります。

タスクスケジューラでなくても「カレントディレクトリ」と「実行ファイルのあるディレクトリ」は異なるものですので,
最初から異なることを前提として作るべきです。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: タスクスケジューラでの起動

#3

投稿記事 by ISLe » 7年前

タスクスケジューラでカレントディレクトリを指定できるので、実行ファイルと違う場所をカレントディレクトリにすることもできます。
『開始 (オプション)』なんて項目名になっているので分かりにくいですけど。

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: タスクスケジューラでの起動

#4

投稿記事 by dic » 7年前

>>YuOさん
情報ありがとうございます

>>ISLeさん
パソコン初心者でも使えるようにってことなので、タスクスケジューラの設定をいじるのは
無理かなと思ってます

まとまった時間とれたら、また書き込みます

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: タスクスケジューラでの起動

#5

投稿記事 by ISLe » 7年前

dic さんが書きました:>>ISLeさん
パソコン初心者でも使えるようにってことなので、タスクスケジューラの設定をいじるのは
無理かなと思ってます
ツール.exeを実行するタスクをどのように作成しているのでしょうか?

タスクスケジューラで、実行するプログラムのパスを入力する画面の中にカレントディレクトリを指定するオプションがあるのですけど。

(追記)
タスクの構成が、Windows 7かWindows Vistaかでプログラム実行時のカレントディレクトリの扱いが違うらしいです。
詳細は不明ですが、カレントディレクトリを設定するにはVista構成を使うほうが便利という情報がちらほら。
GUIでタスクを作成するなら違いはないと思いますけど。

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: タスクスケジューラでの起動

#6

投稿記事 by dic » 7年前

>>ISLeさん
タスクの作成のところに「開始(オプション)(T)」というのがたしかにありました
そして、ここに作業ディレクトrにパスを入力したところ、うまく動作するようになりました
初心者にもわかるように、図解で説明して、補足して、これでよしとします

>>YuOさん
今回は、オプション指定で解決しましたが
GetModuleFileName関数も、使う時がくるかもしれません

解決しました。ありがとうございました。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: タスクスケジューラでの起動

#7

投稿記事 by ISLe » 7年前

schtasksコマンドでコマンドラインからタスクを作成することができます。
バッチファイル等を使ってタスクの作成を自動化することも可能です。

閉鎖

“C言語何でも質問掲示板” へ戻る