• ベストアンサー

一定時間ごとにプログラムを起動させるプログラムを作りたい

「一定時間ごとにプログラムを起動させる」プログラムを、 作成したいと考えております。 #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」を起動できませんでした。 どのような修正をしたら良いのか教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.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(); } }

sora_naegino
質問者

お礼

何故か、BorlandのコンパイラではSetTimerの方をコンパイル出来ませんでした。 Sleepの方は上手くできましたので、こちらでやろうと思います。 ご回答頂きありがとうございました。

その他の回答 (1)

回答No.1

test.exeじゃなくて"./test1.exe"と書いてあるから じゃないんでしょうか。 というのは多分冗談だと思いますが、mainからタイ マーを設定した直後にこのプログラムは終了してし まうではありませんか。なので、kidou()関数がコー ルされる機会がなくなっているのだと思います。 SetTimer()の後にscanf(), getc()などでユーザ入 力があるまで停止するような関数をコールすれば、 test.exeが動き出すと思います。

sora_naegino
質問者

お礼

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

関連するQ&A

  • ShellExecuteで外部アプリを起動したい

    こんにちは。 ShellExecuteを使って外部アプリを起動するために、 ShellExecute(NULL,NULL,"Program Files/XWaveClient/XWavePDA.exe",NULL,NULL,SW_SHOWNORMAL); というコードをかいているのですが、この行で  error C2065: 'ShellExecute' : undeclared identifier というコンパイルエラーがでてしまい、困っています。 ShellExecuteを使うためにはなにかヘッダファイルを includeしなくてはならないのでしょうか? 環境は、eVC++4.0です。 よろしくお願い致します。

  • ShellExecuteのことで。

    はじめまして。 最近c言語のプログラミングを始めて、 cでフォルダを開くプログラムをテストしていましたら、 あるフォルダだけ、エラーが発生して、開けません。 フォルダのほうも色々見たのですが、 どうしてもわからないのでどなたか教えてください。 普通に開けたときは33だったのですが 開けなかったフォルダでの戻り値は42でした。 #include<stdio.h> #include<windows.h> int main(void){ HINSTANCE a; a=ShellExecute(NULL,"open","test",NULL,"D:\\",SW_SHOWNORMAL); printf("return = %d",a); return 0; }

  • VC++ で.bat起動

    また、こちらを使わせていただきます。 VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。 .bat fileは次のとおりです。 cd\Program Files\Wireshark> tshark -i.2 greater 170 -a duration:2 -w.... tshark -v-r e:\Test\test5.pcap.... VC++は次のとおり void CStartupapplicationView::OnBnClickedButtontest() { //cmdは、ShellExecuteでも、CreateProcessでも開けられますが、 //bat fileの起動がうまくいきません。 HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL); ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW); //.batファイルは、c:Program Files\Wiresharkの下に入っています。//が、.Batは起動しません。 if (ret <= (HINSTANCE)32) AfxMessageBox("can not Shell.",MB_OK); //別の方法 STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; ZeroMemory(&sinfo,sizeof(STARTUPINFO)); ZeroMemory(&pinfo,sizeof(PROCESS_INFORMATION)); sinfo.cb=sizeof (STARTUPINFO); sinfo.dwFlags=STARTF_USESHOWWINDOW; sinfo.wShowWindow=SW_SHOWNORMAL; if(!CreateProcess(NULL,_T("cmd.exe c:\\test2.bat "), // test2.batは、Document and settings/----------- //Startup applicationの下にはいっていますが、起動しません。 NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)); {//起動失敗 } //

  • VC++からブラウザを起動して・・・

    VC++&MFCで画面を作成しています。 作成した画面のあるボタンをクリックすると、規定のブラウザが起動され、 指定したURLを表示にいくという処理を行いたいので、 ShellExecute( NULL, "open", "http://xxx.xxx.co.jp/", NULL, NULL, SW_SHOWNORMAL ); という様な感じでブラウザを起動しているのですが、このブラウザの起動時に、 アドレスバー・ツールバー等を非表示にしたいのです。 ShellExecute()じゃなくても良いので、VC++(SDK、MFC何でも可)で 実現する方法はあるのでしょうか?。 よろしくお願いします。

  • スレッドを2つ作って1秒ごとに2つのスレッドが数値を表示するプログラム

    スレッドを2つ作って1秒ごとに2つのスレッドが数値を表示するプログラムを作りたいのですがうまくいきません。 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<pthread.h> void *threadMain(void *threadArgs); int main(void) { int i = 0; pthread_t threadID; for(i = 0;i < 2;i++){ pthread_create(&threadID,NULL,threadMain,(void *)NULL); } } void *threadMain(void *threadArgs) { int i = 0; while(1){ printf("%d\n",++i); sleep(1); } } 上記プログラムを実行すると1が2回表示されて終了してしまいます。 どこか間違えがあるのでしょうか。。

  • 秋月PA.exe用のCプログラム

    現在PIC(16F84A)へ書き込むプログラムを作成しています。 プログラムはC言語にしたいのですが、以下のようなプログラムで PA.exeにドラッグするとエラーがでます。(まだテスト段階です)  #include<16f84.h> void main(void) { }     *ファイル名は『test.c』です  -- エラーメッセージ -- Error C:\PIC_C\test.c:Devicename not selected. どなたか、解決法を教えてください。 C言語プログラムのサンプル等、どこかにないものでしょうか??

  • DLL関数を使ったプログラム

     DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。  以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() {    printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。  そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() {     HMODULE hModule;     DWORD error;     TestFunc funcPointer;     hModule = LoadLibrary(TEXT("plug"));     error = GetLastError();//error値が127     funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc"));     funcPointer();     FreeLibrary(hModule);     getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。

  • ShellExecuteのコマンドについて

    すみません、どなたか教えてください。 下記のコマンドですが、 ShellExecute(null,"open","cmd.exe","実行したいもの",NULL,SW_HIDE); "実行したいもの" の書き方なんですが、 "/c c:\\work\\test.bat" のように書くと、cmd.exeにtest.batを実行させることができたんですが、 実行したいtest.batが指定できず、変数でセットする場合の書き方が分かりません。 ShellExecute(null,"open","cmd.exe","/c c:\\work\\test.bat",NULL,SW_HIDE); ↓ ShellExecute(null,"open","cmd.exe","/c c:\\work\\ "" & 変数 & "",NULL,SW_HIDE); こんな感じだと思うのですが、変数をダブルクォーテーションで囲むときに、ダブルクォーテーションをいくつ重ねるのかが分かりません。ググっているのですが、どこを調べていいのか分からず、はまっています。どなかたアドバイスお願いします。C++です。

  • Acrobat Readerのショートカットが起動できません

    スタートメニュー内のショートカットを起動するアプリを作っているのですが「Acrobat Reader」と「MSN Messenger 6.1」のショートカットだけ起動してくれません。 他のアプリは起動できます。 起動はShellExecuteを使っています。 ShellExecute(m_hWnd, "open", "C:\\Documents and Settings\\All Users\\スタート メニュー\\プログラム\\Adobe Reader 6.0.lnk", NULL, NULL, SW_SHOW); ShellExecuteの戻り値は以下のようになっています。 SE_ERR_ACCESSDENIED : 「オペレーティングシステムが、指定されたファイルへのアクセスを拒否しました。」 エクスプローラでショートカットのプロパティを開いてみると、うまくいかないショートカットは他のショートカットのようにEXEファイルにリンクしているのではなく、何か別のものにリンクしているようです。 このタイプのショートカットの起動の方法を教えてください。 よろしくお願いします。

  • AVRプログラム 関数から戻ってこない

    AtmelStudio6 で、ATmega64A向けにプログラム行なっているのですが、 すごく、単純なところで困っています。 ICEは、AVR JTAGICE です。 main() のみで処理をさせると普通に動くのですが、関数に飛ばすと飛んだ先の 関数から戻ってこなくなるのです。 ツールかレジスタの設定が不十分なのかもしれません。 -- 問題のプログラム -- #include <avr/io.h> #include <avr/iom64a.h> #include <avr/interrupt.h> #include <util/delay.h> void test(void){ DDRA = 0xC0;//<ここは、実行される }//デバッガで見ると、ここで止まっている。 int main(void) { cli();//この関数はライブラリにあるので戻ってくる test();//この関数から帰ってこない // DDRA = 0xC0; //test();の内容をここに書くと、正常に処理して通過する。 PORTB = 0xFF; //B出力レジスタ DDRB = 0xF7; //B方向レジスタ PORTC = 0xFF; DDRC = 0xDB; while(1) { //TODO:: Please write your application code LEDを点滅させるプログラム <略> } } ------------------------------------------------------- 何方か心当たりのある方は居ないでしょうか?

専門家に質問してみよう