ページ 11

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

Posted: 2013年1月09日(水) 15:25
by dic
http://dixq.net/forum/viewtopic.php?f=3&t=12050 の続きです

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

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

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

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

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


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

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

Posted: 2013年1月09日(水) 16:11
by YuO
タスクスケジューラということで 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;
}
のような感じでしょうか。
# デバッグしていない上にエラー処理をしていないので,ちゃんと処理をする必要があります。

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

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

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

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

Posted: 2013年1月11日(金) 16:41
by dic
>>YuOさん
情報ありがとうございます

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

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

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

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

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

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

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

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

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

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

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

Posted: 2013年1月12日(土) 21:57
by ISLe
schtasksコマンドでコマンドラインからタスクを作成することができます。
バッチファイル等を使ってタスクの作成を自動化することも可能です。