まずは下のC++のソースをご覧ください。
------------------------------------------------
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo = { 0 };

printf ("Start of Proc\n");

CreateProcess ( NULL, "c:\proc01.exe", NULL, NULL, FALSE,
0, NULL, NULL, &StartupInfo, &ProcessInfo)

printf ("End of Proc\n");

------------------------------------------------
この処理でCreateProcessで指定された"c:\proc01.exe"が起動されて
終了した時に、下のprintf()関数が実行されるのようにしたいのですが、
そのような処理をするAPI関数、またはC++関数をご存知ないでしょうか?

このQ&Aに関連する最新のQ&A

INFINITE」に関するQ&A: INFINITEの子供の時の写真

A 回答 (3件)

WaitForSingleObject(...)を使ってみてください。



CreateProcess()の最後の引数であるProcessInfo構造体のhProcessを
WaitForSingleObject()に渡してやります。


例:
以下は、StartupInfoおよびProcessInfoが正常に確保・初期化されていることが
前提です。確保・初期化されていなければ希望の動作はしません。
...
printf ("Start of Proc\n");

CreateProcess ( NULL, "c:\proc01.exe", NULL, NULL, FALSE,
0, NULL, NULL, &StartupInfo, &ProcessInfo);

// proc01.exe起動待ち
// proc01.exeがシグナル状態になるのを待ちます
// 状況によっては省略化
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

// proc01.exe終了待ち
// 上の逆で、proc01.exeが非シグナル状態になるのを待ちます
while(1)
{
if(WaitForSingleObject(ProcessInfo.hProcess, 1)!=WAIT_OBJECT_0)
break;
}
printf ("End of Proc\n");
...

各関数の詳細は、VC++オンラインヘルプ(MSDN)で確認してください。

PS
FindWindow(...)を使う手もあります。
    • good
    • 0

ありますよ。


僕の極秘ノート(笑)によれば、
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
です。たぶんあっていますが今確認が取れません。
ついでに言えばウインドウの再描画もされませんよ。
    • good
    • 0

終了されたか調べるのではなくて終了するまで待つんじゃないでしょうか?


VBで出来るんでCでも大丈夫だと思いますけど。
CreateProcessの引数で待ちみたいなのって無いのでしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

QC,C++,C++/CLIの構造体とクラス

C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが
privateかpublicかという違い「だけ」しか全くないのでしょうか?

クラスにおける
value class / ref class
という分類はC++/CLIのもので
これについては
value class の方は C言語の構造体に近いという事でいいでしょうか?

ref classの方は
ネイティブのC++のクラスを
マネージ用にしたようなもので

C++/CLIの構造体は
C++のそれと同じで
OKですか?

そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

Aベストアンサー

> ということは、structも継承可、という事でしょうか?

structでも継承可能です。

> 継承のアクセス指定の方は
> クラスと構造体ではどうなるのでしょうか?

class A : Base {};



class A : private Base {};

と等価です。
一方、

struct A : Base {};



struct A : public Base {};

と等価です。

> そして「集成体」というのが初めて知ったのですが
> これはいわゆる、配列や・・・ある条件下でのクラス・・?
> なのでしょうか?

配列と以下の条件をすべて満たすクラスのことです。
・ユーザー定義のコンストラクタを持たない
・非公開または限定公開のメンバを持たない
・基底クラスを持たない
・仮想関数を持たない

ちなみにC言語の集成体は、配列と構造体の総称です(共用体は集成体ではありません)。

Qc:\Winodows\Sendotoとc:\Windows\デスクトップについて

設定によってはシステムをc:\Winodowsからc:\winにできるから
c:\Winodows\Sendotoとc:\Windows\デスクトップを
c:\win\Sendotoとc:\win\デスクトップにできます

同じように"Sendoto"と"デスクトップ"を例えば"Send"と"desktop"のように他の名前にできるのでしょうか?
できたとするとどのように命名されているかはどこを見れば良いのでしょうか?

Sendotoのファイル等はデスクトップ上の右クリックメニューの送るに表示され
デスクトップのファイル等は起動後に真っ先に現れる画面に表示されますね

よろしくお願いします

Aベストアンサー

SHGetSpecialFolderLocationを使ってください。

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=235894

QWindows上のマウス操作をプログラムで実現したい(C,C++,C#)

Windows上で、マウスで右クリック→ファイル名をコピー→貼り付け

という動作をプログラミングによって実現したいのですが、どのようにしたら良いのでしょう?
やはり、APIを使うと思うのでC#が適しているかと自分では思っているのですが、CでもC++でもかまいません。
どなたかご教授願えますか?よろしくお願いいたします。

Aベストアンサー

★『ファイル名をコピー』の処理を自分のプログラムに組み込んでみるのはどう?
・もう少しだけ詳しい動作の仕組みを補足要求します。
・また『mouse_event』という API 関数は古いので新しい関数『SendInput』を使いましょう。
・ただし、この『SendInput』関数はマウス以外にキーボードのエミュレートも行えるため
 少しだけ複雑な指定になります。慣れれば何てことないが…。→また紹介します。
・まぁ、とにかくもう少し何を行いたいのかを補足して下さい。
・まさか、本当に『右クリック』→『ファイル名をコピー』→『貼り付け』の3ステップを
 行いたいのですか?

参考URL:http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200412/04120036.txt

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む


人気Q&Aランキング

おすすめ情報