• ベストアンサー

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

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