アプリ版:「スタンプのみでお礼する」機能のリリースについて

「一定時間ごとにプログラムを起動させる」プログラムを、
作成したいと考えております。

#include <windows.h>
#include <stdio.h>
void CALLBACK kidou()
{
char pass[255];
sprintf(pass,"./test1.exe");
ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL);
}
void main()
{
SetTimer(NULL,1,1000,kidou);
}
この様な感じで作成しましたが、「test.exe」を起動できませんでした。
どのような修正をしたら良いのか教えていただけないでしょうか?

A 回答 (2件)

問題点が2点あります。



1. kidou関数がTIMEPROC型ではない。
SetTimerに渡すためにはkidou関数は、
void CALLBACK kidou(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
と宣言されいる必要があります。
このままではコンパイルもできないのではないでしょうか。

2. メッセージループが無い
SetTimerはWM_TIMERメッセージをPostすることを指示するだけなので、
それを受け取る部分を用意しておかないとkidou関数は呼び出されません。
SetTimer呼び出し後にメッセージループを挿入する必要があります。

以上の問題を修正すると、次のようになります。

#include <windows.h>
#include <stdio.h>

void CALLBACK kidou(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{
char pass[255];
sprintf(pass,"./test1.exe");
ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL);
}

void main()
{
SetTimer(NULL,1,1000,kidou);
MSG msg;
BOOL bRet;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
}else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}

一応Visual C++.NET 2003で一定時間ごとにkidouが呼び出されることは確認しました。

最初に提示されたコードにSetTimerが書いてありましたのでSetTimerを使いましたが、
コンソールアプリケーションならば、SetTimer&メッセージループという大仰なものを
使うよりは、Sleepで1秒待った方が楽だと思います。
Sleepを使うと以下のようになります。

void kidou()
{
char pass[255];
sprintf(pass,"./test1.exe");
ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL);
}

void main()
{
while (1) {
Sleep(1000);
kidou();
}
}
    • good
    • 0
この回答へのお礼

何故か、BorlandのコンパイラではSetTimerの方をコンパイル出来ませんでした。

Sleepの方は上手くできましたので、こちらでやろうと思います。
ご回答頂きありがとうございました。

お礼日時:2005/01/08 21:48

test.exeじゃなくて"./test1.exe"と書いてあるから


じゃないんでしょうか。

というのは多分冗談だと思いますが、mainからタイ
マーを設定した直後にこのプログラムは終了してし
まうではありませんか。なので、kidou()関数がコー
ルされる機会がなくなっているのだと思います。

SetTimer()の後にscanf(), getc()などでユーザ入
力があるまで停止するような関数をコールすれば、
test.exeが動き出すと思います。
    • good
    • 0
この回答へのお礼

記入ミスしてしまいました。すいません(汗)

scanfを使ってみたのですが、上手くいきませんでした。
ご回答頂きありがとうございました。

お礼日時:2005/01/08 21:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!