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

VC++にて

以下でメモ帳を起動することが出来ました。
::WinExec(_T("notepad.exe"),SW_SHOW);

こんどは、CreateProcess()でメモ帳を起動したいのですがどう書けば良いのですか?

また、メモ帳を終了させるにはどう記述すれば良いのでしょうか?

よろしくお願いします。

A 回答 (5件)

とりあえず起動の方法だけ



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を起動したメモ帳のハンドルに送ります。
    • good
    • 0
この回答へのお礼

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

win98にてパスを変更して試してみましたが、メモ帳は起動しませんでした。

教えていただいたコードを見ても何やら面倒くさそうですね。

お礼日時:2003/07/13 16:00

>win98にてパスを変更して試してみましたが、メモ帳は起動しませんでした。



おそらく起動はしています。
ただ、表示されていないだけです。

CreateProcessをコールする前に、次の2行を足してください。

s.dwFlags = STARTF_USESHOWWINDOW;
s.wShowWindow = SW_SHOWDEFAULT;

あと、正常に起動したら、不要なハンドルを閉じる必要があります。

CloseHandle(p.hProcess);
CloseHandle(p.hThread);



>SendMessageでWM_CLOSEを起動したメモ帳のハンドルに送ります。

WM_CLOSEはPostMessageで送るべきですよ。
    • good
    • 0
この回答へのお礼

>おそらく起動はしています。
>ただ、表示されていないだけです。
これを確認する方法はあるのでしょうか?

>CreateProcessをコールする前に、次の2行を足してください。
足してみましたが、やはり起動しませんでした。

>あと、正常に起動したら、不要なハンドルを閉じる必要があります。
閉じなかったらどのような不具合があるのでしょうか?



>SendMessageでWM_CLOSEを起動したメモ帳のハンドルに送ります。

>WM_CLOSEはPostMessageで送るべきですよ。
そもそもハンドルの取得はどのようにすれば出来るのでしょうか?

以上質問ばかりで申し訳ありませんが、お分かりの方よろしくお願いします。

お礼日時:2003/07/13 22:29

>>おそらく起動はしています。


>>ただ、表示されていないだけです。
>これを確認する方法はあるのでしょうか?

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
    • good
    • 0
この回答へのお礼

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

>Win95やWin98でしたら、Ctrl+Alt+Delで表示される
>プログラムの一覧にあったかな?忘れてしまいました。
Ctrl+Alt+Delで確認した結果が正しいとすると、やはり起動していませんでした。

>とりあえず、成否の確認は、戻り値やGetLastErrorで取得する癖をつけてください。
是非そうしたいのですが、残念ながら今の私にはやり方が判りません。
もし、教えていただけるのでしたら助かります。

>すみません。もう1行足してください。
>s.cb = sizeof(STARTUPINFO);
追加しましたが、やはり起動しませんでした。

>ここらへんをどうぞ。
>起動、終了の両方とも参考になると思います。
おぉ~、これは役立つサイトを紹介頂きありがとうございます。
いろいろなサイトを参考にしていますが、このサイトは知りませんでした。
サイトの通りにやったら、起動、終了ともうまく行きました。

お礼日時:2003/07/14 08:41

>>とりあえず、成否の確認は、戻り値やGetLastErrorで取得する癖をつけてください。


>是非そうしたいのですが、残念ながら今の私にはやり方が判りません。
>もし、教えていただけるのでしたら助かります。

戻り値は普通の関数の戻り値と一緒ですよ。
BOOL bRet = CreateProcess( ...

とでもして値を取得してください。

戻り値の型、値の意味は、ヘルプを参照してください。
http://www.microsoft.com/japan/developer/library …


GetLastError()も呼び出すだけです。
WinAPIのコールで異常になったら呼び出して、戻り値を取得します。

値の意味は、一般的なものなら、VC++インストール時に一緒にインストールされるError Lookupというツールで確認できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/14 19:18

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 );
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/19 21:42

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

このQ&Aを見た人はこんなQ&Aも見ています