• ベストアンサー

別アプリの起動、終了について

VC++にて 以下でメモ帳を起動することが出来ました。 ::WinExec(_T("notepad.exe"),SW_SHOW); こんどは、CreateProcess()でメモ帳を起動したいのですがどう書けば良いのですか? また、メモ帳を終了させるにはどう記述すれば良いのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

とりあえず起動の方法だけ PROCESS_INFORMATION p; STARTUPINFO s; memset((void *)&p,NULL,sizeof(PROCESS_INFORMATION)); memset((void *)&s,NULL,sizeof(STARTUPINFO)); CreateProcess("c:\\winnt\\notepad.exe","",NULL,NULL,FALSE,0,NULL,NULL,&s,&p); 終了させるには SendMessageでWM_CLOSEを起動したメモ帳のハンドルに送ります。

VitaminBB
質問者

お礼

回答ありがとうございます。 win98にてパスを変更して試してみましたが、メモ帳は起動しませんでした。 教えていただいたコードを見ても何やら面倒くさそうですね。

その他の回答 (4)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.5

MSDNでGetLastErrorを調べましたか? そのなかにFormatMessageというリンクがありますが そこにGetLastErrorの使用例が出ています。 LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // デフォルト言語 (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf );

VitaminBB
質問者

お礼

回答ありがとうございます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>>とりあえず、成否の確認は、戻り値やGetLastErrorで取得する癖をつけてください。 >是非そうしたいのですが、残念ながら今の私にはやり方が判りません。 >もし、教えていただけるのでしたら助かります。 戻り値は普通の関数の戻り値と一緒ですよ。 BOOL bRet = CreateProcess( ... とでもして値を取得してください。 戻り値の型、値の意味は、ヘルプを参照してください。 http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createprocess.htm GetLastError()も呼び出すだけです。 WinAPIのコールで異常になったら呼び出して、戻り値を取得します。 値の意味は、一般的なものなら、VC++インストール時に一緒にインストールされるError Lookupというツールで確認できます。

VitaminBB
質問者

お礼

いろいろ教えていただきありがとうございます。 是非活用したいと思います。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>>おそらく起動はしています。 >>ただ、表示されていないだけです。 >これを確認する方法はあるのでしょうか? Win2000や、XPならタスクマネージャでプロセスの存在を確認できます。 Win95やWin98でしたら、Ctrl+Alt+Delで表示される プログラムの一覧にあったかな?忘れてしまいました。 あと、VC++インストール時に、一緒にプロセス一覧を取得するツールもインストールしていたような。 とりあえず、成否の確認は、戻り値やGetLastErrorで取得する癖をつけてください。 >>CreateProcessをコールする前に、次の2行を足してください。 >足してみましたが、やはり起動しませんでした。 すみません。もう1行足してください。 s.cb = sizeof(STARTUPINFO); >>あと、正常に起動したら、不要なハンドルを閉じる必要があります。 >閉じなかったらどのような不具合があるのでしょうか? 無駄にメモリが消費されたままになります。 >>WM_CLOSEはPostMessageで送るべきですよ。 >そもそもハンドルの取得はどのようにすれば出来るのでしょうか? ここらへんをどうぞ。 起動、終了の両方とも参考になると思います。 http://cgi23.plala.or.jp/a-w-h/mfc/appclose.html

参考URL:
http://cgi23.plala.or.jp/a-w-h/mfc/appclose.html
VitaminBB
質問者

お礼

何度も回答ありがとうございます。 >Win95やWin98でしたら、Ctrl+Alt+Delで表示される >プログラムの一覧にあったかな?忘れてしまいました。 Ctrl+Alt+Delで確認した結果が正しいとすると、やはり起動していませんでした。 >とりあえず、成否の確認は、戻り値やGetLastErrorで取得する癖をつけてください。 是非そうしたいのですが、残念ながら今の私にはやり方が判りません。 もし、教えていただけるのでしたら助かります。 >すみません。もう1行足してください。 >s.cb = sizeof(STARTUPINFO); 追加しましたが、やはり起動しませんでした。 >ここらへんをどうぞ。 >起動、終了の両方とも参考になると思います。 おぉ~、これは役立つサイトを紹介頂きありがとうございます。 いろいろなサイトを参考にしていますが、このサイトは知りませんでした。 サイトの通りにやったら、起動、終了ともうまく行きました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>win98にてパスを変更して試してみましたが、メモ帳は起動しませんでした。 おそらく起動はしています。 ただ、表示されていないだけです。 CreateProcessをコールする前に、次の2行を足してください。 s.dwFlags = STARTF_USESHOWWINDOW; s.wShowWindow = SW_SHOWDEFAULT; あと、正常に起動したら、不要なハンドルを閉じる必要があります。 CloseHandle(p.hProcess); CloseHandle(p.hThread); >SendMessageでWM_CLOSEを起動したメモ帳のハンドルに送ります。 WM_CLOSEはPostMessageで送るべきですよ。

VitaminBB
質問者

お礼

>おそらく起動はしています。 >ただ、表示されていないだけです。 これを確認する方法はあるのでしょうか? >CreateProcessをコールする前に、次の2行を足してください。 足してみましたが、やはり起動しませんでした。 >あと、正常に起動したら、不要なハンドルを閉じる必要があります。 閉じなかったらどのような不具合があるのでしょうか? >SendMessageでWM_CLOSEを起動したメモ帳のハンドルに送ります。 >WM_CLOSEはPostMessageで送るべきですよ。 そもそもハンドルの取得はどのようにすれば出来るのでしょうか? 以上質問ばかりで申し訳ありませんが、お分かりの方よろしくお願いします。

関連するQ&A

  • 別アプリ終了させる

    いつもお世話になります。 再度質問ですが、 A.EXEとB.EXEがあり、B.EXEはA.EXEからShellExecuteで起動させています。 起動したB.EXEからA.EXEを終了させたいのですが、それにはA.EXEの ウィンドウハンドルが必要になると思います。 このときにA.EXEのタイトルは動的に変更されるので、FindWindowは使えません。 そこでA.EXEからB.EXEを起動した時にhWNDを送ってやれば、B.EXEからA.EXEを 操作できるとおもいます。 hWNDを対象アプリに送りたいのですが、ShellExecuteやCreateProcessのパラメータにhWndを持たすことはできるのでしょうか? もたせることができそうですが、具体的にどう記述すればいいのかが わからないので、サンプルソースをつけていただければありがたいです。 見当違いであれば、別の方法をご教授ください。 よろしくお願いします。

  • CreateProcessでアプリが終了しない

    ちょっとした変換ツールを作ろうと思い、ダイアログベースの MFCアプリケーションを作成しました。 OKボタンが押された時にCreateProcess()で子プロセスを 起動して、終了したら結果表示して親プロセスも終了する 様にしようと思ったのですが、結果表示までは正常に 実行されるのですが、親プロセスが終了しません。 恐らくCreateProcess()に渡す引数が悪いのだと思うのですが、 どなたかわかる方がいらしたらご教示願います。 void CMscGenSelectorDlg::OnBnClickedOk() {   STARTUPINFO si;   PROCESS_INFORMATION pi;   ZeroMemory( &si, sizeof si );   si.cb = sizeof si;   ZeroMemory( &pi, sizeof pi );   // 子プロセス起動   CreateProcess(     NULL,                // モジュール名     _T("mscgen.exe -Tpng hoge.msc"),  // コマンドライン     NULL,                // セキュリティ記述子     NULL,                // セキュリティ記述子     FALSE,               // ハンドルの継承オプション     0,                 // 作成のフラグ     NULL,                // 新しい環境ブロック     NULL,                // カレントディレクトリ名     &si,                // スタートアップ情報     &pi);                // プロセス情報   // 子プロセス終了待ち   WaitForSingleObject( pi.hProcess, INFINITE );   CloseHandle( pi.hProcess );   CloseHandle( pi.hThread );   // シーケンスチャート表示   ShellExecute( NULL, _T("open"), _T("hoge.png"), NULL, NULL, SW_SHOW );   // 終了   OnOK(); }

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

  • 他アプリの起動

    builderC++を使用してます。 sample.exeを起動した際にもう一つの他アプリ(sample2.exe)を起動させ、 sample.exeを終了した際に一緒に起動したsample2.exeも終了させるコードはどういう風に書けばよろしいですか? WindowsAPIのCreateProcessを使い起動させようとしてます。 ご教授お願いします。

  • 別アプリを終了する方法

    A.EXE と B.EXEがあったとします。 A.EXEからShellExecuteアプリケーションB.EXEを立ち上げたとします。 その時にA.EXEを終了せずにB.EXEの処理が終わり次第、B.EXEからA.EXEを、 終了させたいのですが、可能でしょうか? いろいろと調べてみたのですが、見当がつきません。 どなかたご教授願えませんでしょうか? ちなみにVC++6.0MFCです。

  • VC++アプリからEXCELを起動できない。

    じんちゃんと申します。 EXCEL2003をVCアプリからバックグラウンド起動したいのですが上手くいきません。 どなたかご存知でしたら助けてください。主な条件は次の通りです。 [概要] VCアプリ内でCreateProcess()を用いてEXCEL.EXEをブック(.xls)引数で起動しています(ブックはマクロ付き)。 [環境]  ・EXCEL2003のみの製品をインストール。   VB6.0のランタイムを入れています。   Framework1.1も念のため入れました。  ・VC++.Netで開発したEXEからEXCELを起動しています。  ・OSはWindowsXP SP2です。  ・以前は動いていたのですがある日以降動かなくなりました。  ・現在でも起動対象ブックを手動で起動すると画面が問題なく表示されます。 [現象] 1.起動するとEXCELの起動ロゴが一瞬表示されるが起動しない。   タスクマネージャを見てもEXCEL.EXEが存在しない。 2.起動失敗後、対象ブックを手動で開くとセーフモード起動を聞かれます。   加えて起動後、マクロセキュリティを低に設定していたのが強制的に高   に設定されてしまっています。   手動起動後、以降、セーフモード起動は聞かれません。   CreateProcess()からの起動(バックグラウンド起動)した場合にのみ起動失敗します。 3.EXCEL2003を再度インストールして実施しても変化なし。 4.CreateProcess()の戻り値は正常でした。 5.他のNOTEPAD.EXEをEXCEL.EXEに変更して起動すると表示される。   恐らくEXCEL2003のみの固有問題と思います。   他のEXCELバージョンでは問題なく起動できます。 6.EXCEL2003だとブック指定なしでEXCEL.EXEを単体起動しても起動に失敗します。 よろしくお願いします。

  • VC++アプリからEXCELを起動しても画面が出ない

    はじめまして。 じんちゃんと申します。 EXCEL2003をVCアプリから起動したいのですが上手くいきません。 どなたかご存知でしたら助けてください。主な条件は次の通りです。 [概要] VCアプリ内でCreateProcess()を用いてEXCEL.EXEをブック(.xls)引数で起動しています(ブックはマクロ付き)。 [環境]  ・EXCEL2003のみの製品をインストール。VBランタイムは入れています。   VB6.0のランタイムを入れています。   Framework1.1も念のため入れました。  ・VC++.Netで開発したEXEからEXCELを起動しています。 2.OSはWindowsXP SP2です。 3.以前は動いていたのですが突然動かなくなりました。 4.現在でもブックを手動で起動すると画面が問題なく表示されます。 [現象] 1.起動するとEXCELの起動ロゴが一瞬表示されるが起動しない。 2.起動失敗後、ブックを手動で開くとセーフモード起動を聞かれます。   加えて起動後、マクロセキュリティを低に設定していたのが強制的に高   に設定されてしまっています。   CreateProcess()からの起動した場合にのみ起動失敗し環境が変わりま   す(前述のセキュリティレベルが強制変更される)。 3.EXCEL2003を再度インストールして実施しても変化なし。 4.CreateProcess()の戻り値は正常でした。 5.他のNOTEPAD.EXEをEXCEL.EXEに変更して起動すると表示される。   恐らくEXCELのみの固有問題と思います。 6.ブック指定なしでEXCEL.EXEを単体起動しても起動に失敗します。 よろしくお願いします。

  • vbsでアプリを自動終了する

    notepadを起動せさ、「Hello」とキーボードより入力させてから自動的に終了させるvbsで作成しましたが、キーボード入力させるところまで成功しましたが、notepadを自動的に終了させる部分が成功しておりません。(イメージはユーザは何もせずnotepadを保存せずに自動終了させます。)下記のとおり 途中なのですがアドバイスをお願い致します。 ----------------------------------------------------------- Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "notepad.exe" WScript.Sleep 1000 objShell.SendKeys "hello ,"

  • 常駐し他のプロセスの起動を取得する方法

    test.exeというプログラムを作ります。 実行すると特定のプロセスの起動を待ちます。 特定のプロセスをnotepad.exeとします。 メモ帳(notepad.exe)が起動されたらtest.exeは何かします。 例えばMessageBox()とかで何か表示します。 どうやればいいのでしょうか? ・特定のプロセスが起動するまで待つ ・起動を検知する というところを教えてください。 VC++です。MFC,ATLなどは使いません。 特にウインドウなどはいらないので数行でできてしまうのであれば winmain()からお願いします。

  • 別アプリの終了について

    いつもお世話になります。 開発環境はVC++6.0MFCです。 以前にも質問させていただいたのですが、 A.EXEとB.EXEがあったとします。 A.EXEをB.EXEから終了させたい。 しかし、A.EXEのタイトル(キャプション)は動的に 変更があり、タイトルNULLの時もある。 私はFindWindowでウィンドウハンドルを取得し、WM_CLOSE を投げているのですが、この方法だと上記理由により、 不正動作になります。 どなたかこういう場合の解決方法をご存知の方、 ご教授よろしくお願い致します。

専門家に質問してみよう