exeファイルを終了させたい

解決


初心者  2003-12-12 10:00:35  No: 52846  IP: [192.*.*.*]

WinExec("Notepad.exe",SW_SHOW)でメモ帳を起動させることができたのですが。
どうしてもボタンを押したイベントとしてメモ帳を終了させる方法が分かりません。
誰かわかりませんか?

編集 削除
YuO  2003-12-12 11:11:35  No: 52847  IP: [192.*.*.*]

Win32環境において,他のプロセスを確実かつ安全に終了させる,汎用の方法は存在しません。

WinExecではなくCreateProcessを利用してNotepadを起動させ,
得たスレッドIDを元にEnumThreadWindowsでNotepadのウィンドウを探し,
WM_CLOSEをpostすることによって,終了してくれるかもしれません。

まぁ,最後の手段はTerminateProcessですが……。

編集 削除
初心者  2003-12-12 12:03:45  No: 52848  IP: [192.*.*.*]

エラーがでてしまいなかなかうまくできません。
サンプルコードなどありましたらのせてもらえないでしょうか?

編集 削除
YuO  2003-12-12 13:27:03  No: 52849  IP: [192.*.*.*]

エラーが出たとはどのようなエラーが出たのですか?
また,エラーが出た周辺の関連するコードも書いてみて下さい。

編集 削除
初心者  2003-12-12 13:33:04  No: 52850  IP: [192.*.*.*]

void CMyDlg::OnButton1() 
{
  // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
  CreateProcess("notepad.exe");
  char cMsg[128];
  wsprintf(cMsg, "メモ帳を使用しますか?");
  int iMsg = MessageBox(cMsg,"メッセージボックス", MB_YESNO | MB_ICONQUESTION);
  if(iMsg==IDNO)
  {
    EnumThreadWindows("notepad.exe");
  }
}

エラー:'CreateProcessA' : 関数が不正な 1 個の実引数をともなって呼び出されました。
エラー:'EnumThreadWindows' : 関数が不正な 1 個の実引数をともなって呼び出されました。

編集 削除
YuO  2003-12-12 13:39:18  No: 52851  IP: [192.*.*.*]

とりあえず,MSDNでちゃんと関数の仕様を調べて下さい。
http://msdn.microsoft.com/library/en-us/dllproc/base/createprocess.asp
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/EnumThreadWindows.asp

編集 削除
初心者  2003-12-12 14:14:54  No: 52852  IP: [192.*.*.*]

void CMyDlg::OnButton1() 
{
  // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
  /*WinExec("notepad.exe",SW_SHOW);
  char cMsg[128];
  wsprintf(cMsg, "メモ帳を使用しますか?");
  int iMsg = MessageBox(cMsg,"メッセージボックス", MB_YESNO | MB_ICONQUESTION);
  if(iMsg==IDYES)
  {
    CDialog::OnCancel();
  }*/
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    // Start the child process. 
    if( !CreateProcess( "notepad.exe", // No module name (use command line). 
        "MyChildProcess", // Command line. 
        NULL,             // Process handle not inheritable. 
        NULL,             // Thread handle not inheritable. 
        FALSE,            // Set handle inheritance to FALSE. 
        0,                // No creation flags. 
        NULL,             // Use parent's environment block. 
        NULL,             // Use parent's starting directory. 
        &si,              // Pointer to STARTUPINFO structure.
        &pi )             // Pointer to PROCESS_INFORMATION structure.
    ) 
    {
        ErrorExit( "CreateProcess failed." );
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
--------------------------------------------------------------------
エラー:'ErrorExit' : 定義されていない識別子です。
とまたエラーが出てしまいました。
実際の所、ボタンを押したら本当はメモ帳ではなく、"wmplayer.exe"
Windows Media Playerを立ち上げたいんです。
「Windows Media Playerを使用しますか??」とメッセージボックスを表示させ、「いいえ」を押したら、Windows Media Playerを終了させたいんですが…。

編集 削除
りばぁ  2003-12-12 15:26:36  No: 52853  IP: [192.*.*.*]

こんにちわ。
ErrorExitって言うのがエラーになってるんですよね?
これって、初心者さんが自作した関数のようですが、
それが間違ってるようですねぇ。
  エラーの通り、ちゃんと定義していないだけでは・・・^^;

  ちなみに、メディアプレーヤーはたしかパスが通ってないので
ノートパッドの起動のように、EXE名だけではダメだと思います。
フルパスで指定してください。(自分でパス通せばおっけー?)

編集 削除
初心者  2003-12-12 15:50:24  No: 52854  IP: [192.*.*.*]

りばぁさん、こんにちは!
メディアプレーヤー解決しました♪♪
どうもありがとうございました。
YuOさんもホントにありがとうございました!!
かなり助かりました。

編集 削除
YuO  2003-12-12 16:17:24  No: 52855  IP: [192.*.*.*]

というか……。
順序が逆では?

起動するか否かの確認をとって,
IDYESが返ってきたら起動するのが安全ですが……。
#終了させる確実な方法がないから。

編集 削除
RAPT  2003-12-15 01:15:36  No: 52856  IP: [192.*.*.*]

> 最後の手段はTerminateProcessですが
とYuOさんもおっしゃっているように、これを行なうと、
OSが不安定になることもあります。
以前、Win98でやってみたら、ブルーバックになった。。

編集 削除
初心者  2003-12-15 13:56:41  No: 52857  IP: [192.*.*.*]

起動するか否かの確認をとって,
IDYESが返ってきたら起動する
ようにしていますから安心です。

さらに質問ですが、メディアプレーヤーを立ち上げたら、
自動的に自分が表示したい画面(曲)が表れるようには出来るのですか??

編集 削除
とおりすがり  2003-12-15 23:10:19  No: 52858  IP: [192.*.*.*]

とりあえず、再生したいメディアファイル名をフルパスで引数に渡したところ
起動と同時に再生を開始しました。
CreateProcess での引数の渡し方についてはMSDNを参考にして下さい。

編集 削除
初心者  2003-12-16 09:40:13  No: 52859  IP: [192.*.*.*]

すみませんがそのサンプルコードを
教えていただけませんか?
お願いします!!

編集 削除
とおりすがり  2003-12-16 15:01:17  No: 52860  IP: [192.*.*.*]

とりあえず、即効で組んだコンソールアプリですが、
一応動作することは確認しました。
私の家の環境(Win2kSP4+VC7)ではメディアプレイヤー(wmplayer.exe)
にはパスが通っていなかったので、フルパスを直打ちしていますが、
これは初心者さんの環境に合わせて変更してください。
(当然メディアファイルのフルパスも)

------------------------------------------------------------

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

int main()
{
  char exe[] = "C:\\Program Files\\Windows Media Player\\wmplayer.exe";
  char cmd[] = "\"C:\\Program Files\\Windows Media Player\\wmplayer.exe\" 適当なムービーファイルのフルパス";

  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  ZeroMemory( &pi, sizeof(pi) );
  si.cb = sizeof(si);

  if( !CreateProcess(exe, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) ) {
    fprintf(stderr,"起動失敗\n");
    exit(-1);
  }

  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
  exit(0);
}

------------------------------------------------------------

編集 削除
なーめ  2003-12-17 07:11:23  No: 52861  IP: [192.*.*.*]

>> char cmd[] = "\"C:\\Program Files\\Windows Media Player\\wmplayer.exe\" 適当なムービーファイルのフルパス";
最初にスペースがあれば EXEのパスはこちら側に入れなくてもいいですよ。
逆に最初にスペースがないと、引数なしの扱いになるみたい。
(Win2000,sp4,VC++6.0,sp5)
瑣末でした。

編集 削除
初心者  2003-12-17 09:10:53  No: 52862  IP: [192.*.*.*]

とおりすがりさん、どうも親切に教えていただきありがとうございました。
また、なーめさんもご提案ありがとうございました。
本当に助かりました。

編集 削除