こんにちは。
あるアプリケーションから、別のアプリケーションを起動し、そのアプリが起動したかどうか(起動完了の確認)をとりたいのですが・・・。
CreateProcessで可能なのですか??
また可能であっても不可能であっても、何か別の方法をご存知ないでしょうか??
よろしくお願いします。

A 回答 (1件)

こんにちは。



APIのWaitForInputIdle関数に起動したプロセスのハンドルを渡してください。
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Qプログラムから別のアプリケーションを起動する

■C言語とWIN32APIでプログラムしています。
■自作したアプリケーションを実行形式(*.exe)で多数をCD-ROMに保存しました。
■さらに別にインデックス画面をC言語とWIN32APIで作成して、その画面のボタンから保存したアプリケーションを開こうと思います。
■Web画面のボタンのような事を考えています。

「質問」
・プログラムから別のアプリケーションを起動する方法はどうするのですか。
・ご教示お願いします。
・また関連・参考になるHPもお聞かせください。

Aベストアンサー

DOS窓開いてもよくて何も考えず楽に出来るのが
system("プログラム名");

DOS窓開きたくないとかそのプログラムの完了待ちしたい
とか言うのであれば
CreateProcess関数とか
ShellExecuteEx関数とWaitForSingleObject関数の組み合わせ
この関数にあたってちょっと前にここで質問してるので参考になれば
http://oshiete1.goo.ne.jp/qa5540488.html

Q別のアプリケーションにメッセージを送る事は可能?

環境はWindowsです。
AとBという2つのアプリケーション(またはプログラム)が実行されてるとして、AからBへメッセージを送る事は可能でしょうか?

例えばEnumWindows関数でBのWindowハンドルを取得して、SendMessageやPostMessageを使うことはできますか?もしくは他に正しい方法はありますか?

Aベストアンサー

実行単位であるプロセスの間でデータをやり取りしたいのですね。
結論から言うとSendMessageやPostMessageを使ってできます。

また、こういうデータのやり取りのことを「プロセス間通信」といいますので、
これをキーワードに検索されると目的の情報が得られるかと思います。
参考URLもどうぞご覧ください。

参考URL:http://www7a.biglobe.ne.jp/~lshen/EternalWindows/WinBase/Window/Window09.html

Qこんにちは、よろしくお願いいたします。

こんにちは、よろしくお願いいたします。

OSは、
Windows Vista Ultimate SP2

インストールしたのは、

Microsoft Visual Studio 2010
Microsoft Visual C++ 2010 Express です。

目標は、VC++でクライアント(192.168.0.2)から
FreeBSDサーバーで稼動しているPostgresql8.4の
データを表示、更新等を行うことなのですが、今までは、
PHP5でデータを表示、更新等を行っていました。
VC++はまったくの初心者です。

いちおう初級シスアドを持っており、AccessでのADOやPHPやFreeBSDでの
サーバー構築、Postgresqlの操作等はある程度できます。

http://park1.wakwak.com/~ima/visualcpp_pgsql2.html
を参考にしているのですが
実装するイベントなどどこにコードを書けばよいのかがいまいちわからず
コンパイルがうまくいかないでいます。

上記に必要なコード等のサンプル等、もしくはURLがあれば
ご教示お願いいたします。

こんにちは、よろしくお願いいたします。

OSは、
Windows Vista Ultimate SP2

インストールしたのは、

Microsoft Visual Studio 2010
Microsoft Visual C++ 2010 Express です。

目標は、VC++でクライアント(192.168.0.2)から
FreeBSDサーバーで稼動しているPostgresql8.4の
データを表示、更新等を行うことなのですが、今までは、
PHP5でデータを表示、更新等を行っていました。
VC++はまったくの初心者です。

いちおう初級シスアドを持っており、AccessでのADOやPHPやFreeBSDでの
サーバー構築、Postgresq...続きを読む

Aベストアンサー

参考にしている URL のコードは MFC によるもので、Express Edition では MFC は利用できません。

自分が考えるに、解決策は以下の3通りあると思います。

(1)Win32 APIでウィンドウを作成する
幸いなことに Express Edition でも Windows SDK がインストールされるので、それにより利用可能な Win32 API を使ってウィンドウを作成し、関数をメンバ関数から普通の関数に変更してイベント処理部分で呼び出す方法です。MessageBox() の引数の個数が違いますが、それは簡単に解決できると思います。
以下の URL が参考になりますが、サイト内で言及している「リソースエディタ」がないのでその部分は別の方法を考える必要があります。
http://homepage2.nifty.com/c_lang/
また、学習すべき内容が膨大なため、すぐに動くものがほしい場合には向きません。しかし、ネイティブコードが必要で他のライブラリを使用できないのであればこの手か VisualStudio の Standard edition 以上を購入するしかありません。

(2)他の GUI ライブラリでウィンドウを作成する
GTK+ などの GUI ライブラリを導入してウィンドウを作成し、関数を何かのクラスのメンバ関数からイベントハンドラ関数に変更するという方法です。GTK+ については以下の URL と本が参考になります。
http://www.gtk.org/index.php
http://library.gnome.org/devel/gtk-tutorial/stable/
http://www.amazon.co.jp/%E5%85%A5%E9%96%80GTK-%E8%8F%85%E8%B0%B7%E4%BF%9D%E4%B9%8B/dp/4274067769
学習すべき内容が膨大なため、すぐに動くものがほしい場合には向かないという点では上と同じですが、GTK+ に関していえば上よりも楽です。ネイティブコードが必要ならば有力な選択肢のひとつです。

(3).NET Framework でウィンドウを作成し、PostgreSQL への接続ライヴラリを別なものにする
たぶん質問者が現在ウィンドウを作成しているのは .NET Framework ですが、現在の PostgreSQL への接続ライヴラリはアンマネージドなため、マネージドコードへの変換が必要になってきます。検索してみたところ、以下の .NET Framework 用ライブラリが PostgreSQL 公式サイトから提供されています。
http://npgsql.projects.postgresql.org/
ネイテブコードが必要であるのでなければ、例示した中ではこれを利用するのが一番早いと思います。もっとも、C# を使ったほうがもっと早いと思いますが。

参考にしている URL のコードは MFC によるもので、Express Edition では MFC は利用できません。

自分が考えるに、解決策は以下の3通りあると思います。

(1)Win32 APIでウィンドウを作成する
幸いなことに Express Edition でも Windows SDK がインストールされるので、それにより利用可能な Win32 API を使ってウィンドウを作成し、関数をメンバ関数から普通の関数に変更してイベント処理部分で呼び出す方法です。MessageBox() の引数の個数が違いますが、それは簡単に解決できると思います。
以下の URL が参...続きを読む

Qcreateprocessで起動させる別.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);
で起動しております。

また、実現不可能というお答えでもいいので教えていただければと思います。
お手数ですが何卒よろしくお願いします。

Aベストアンサー

CreateProcessで作成したプロセスのプロセスIDを監視し、そのプロセスIDが有効である間、以下のページの例のように、WM_MOUSEACTIVATEに対してNO_ACTIVATEを返せば良い。

http://d.hatena.ne.jp/kent013/20080304/1204640570

但し、マウス以外の操作(例えばAlt+Tab)によるアクティブ化は上記の方法では防げないので、その場合は「WM_ACTIVATEでアクティブ化を要求されたら、今までアクティブだったウィンドゥを強制的にアクティブ化する」などの処理で、自分自身を非アクティブにすれば良い。

Qアプリケーション起動について

ひろと申します。
クライアントからサーバの共有フォルダにある、他のアプリケーションを
オプション付きで起動させるプログラムをVC++で作成したのですが、
クライアントがNTだとうまくいきません。
たとえば、サーバ上にあるapp.exeを「app.exe /i」のような感じで
起動すると、クライアントがwin98の場合はアプリケーションが
表示されるのですが、NTから起動させようとすると、
アプリケーションは表示されません。
また、オプションを外すとアプリケーションは NTでも表示されます。
APIは、WinExec,ShellExecuteEx,CreateProcessで試したのですが
同じ結果でした。
CreateProcess は以下のように設定してます。
------------------------------------------------------------------
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
CreateProcess(NULL, "serverpath\\app.exe /i", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

プロセスの起動は成功していうようです。
クライアントがNTの場合、他に必要な設定があるのでしょうか?
よろしくお願いします。

ひろと申します。
クライアントからサーバの共有フォルダにある、他のアプリケーションを
オプション付きで起動させるプログラムをVC++で作成したのですが、
クライアントがNTだとうまくいきません。
たとえば、サーバ上にあるapp.exeを「app.exe /i」のような感じで
起動すると、クライアントがwin98の場合はアプリケーションが
表示されるのですが、NTから起動させようとすると、
アプリケーションは表示されません。
また、オプションを外すとアプリケーションは NTでも表示されます。
APIは、WinExec...続きを読む

Aベストアンサー

Windows98 で OK で、WindowsNT で駄目、ということであれば、権限周りを
疑いたくなりますが、オプションの指定を外すと、NT でも OK ってのが
良く分かりませんね。

> プロセスの起動は成功していうようです。

というのは、CreateProcess() の戻り値を確認した、ということでしょうか?

もし、確認していないのであれば、確認しましょう。もし FALSE で返っている
ようであれば、GetLastError() でエラー番号を調べましょう。

もし TRUE で返っているようであれば、どうしましょうか。とりあえずは、
タスクマネージャーで、プロセスが起動されてウィンドウが表示されていない
のか、プロセス自体いない(起動された直後に終了している可能性を疑う)のか
を確認してみるところから、問題を切り分けるのかなあ…


人気Q&Aランキング

おすすめ情報