こんばんは。
以前にも質問したのですが、CreateProcessで起動させたプログラムの起動を待つために、WaitForInputIdleを使用と教わったのですが、コンソールアプリの起動の場合はWaitForInputIdleは待たずにすぐに結果を返してしまうのです。
WaitForInputIdleと同じようなことができ、かつ、コンソールアプリにも使える方法、ご存知の方がいらっしゃったら、教えてください...
よろしくお願いします。

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

A 回答 (1件)

こんにちは。

itohhといいます。

>コンソールアプリの起動の場合はWaitForInputIdleは
>待たずにすぐに結果を返してしまうのです。
WaitForInputIdle関数は、ウィンドウを持つアプリケーションでなくては正常に動作しません。

最終的にどういうことをしたいのかが解りませんが、
EventオブジェクトとCSingleLockオブジェクトを使ってみては如何ですか?

簡単なサンプルを載せておきますので参考にしてください。

<< 親プロセス >>
CEvent* m_Event=NULL;

// 子プロセスを待つためのイベントを作成する。
m_Event = new CEvent( FALSE, FALSE, "Wait_Event" );

CSingleLock wkWait( CSyncObject* m_Event );


//
// 子スレッドを起動するための、CreateProcess関数を実行する。
//

// 子プロセスのm_Event->SetEvent()が実行されるまで待機する。
wkWait.Lock( INFINITE );


-----------------------------------------------
<< 子プロセス >>

起動直後の初期処理が終わった後。
CEvent* m_Event=NULL;

// Eventモジュールをシグナル状態にする
// 3番目の引数は親プロセスと同じにしなければいけない
m_Event = new CEvent( FALSE, FALSE, "Wait_Event" );
m_Event->SetEvent();
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ありません。
無事、解決しました。
ありがとうございました。

お礼日時:2002/01/22 21:52

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

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

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

このQ&Aを見た人が検索しているワード

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

Qコンソールアプリの起動パラメータ について

・環境
  XP, Borland C++ Compiler 5.5

・使用言語
  C++

コンソールアプリを作成しています。
コンパイルして出来上がったEXEのアイコンに、何かファイルを
ドラッグ&ドロップすると、そのファイルがパラメータとなって
EXEが起動されると思うのですが、ここで疑問があります。

(1)最大パラメータ数というのはどこかに規定されているのでしょうか。

(2)複数のファイルをドラッグ&ドロップした時に、EXEに渡される順番というのはどのように決定されるのでしょうか。

よろしくお願い致します。

Aベストアンサー

★アドバイス
>数を少なくすると、問題ないのでどこに原因があるのだろうと探っていた所でした。
 ↑
・私も圧縮/解凍ソフトで同様なエラーがでて驚いたことがあります。
 それで渡せる文字数に限りがあるのだと思いました。
 理由は既に書いていますがパスが深い場合は少なく、パスが浅い(C:\)の場合は
 たくさんのファイルを渡せましたので。今回、回答 No.4 で確認用のサンプルを
 作って文字数の限界値を計算してみました。→この質問をきっかけに。
>ドラッグ&ドロップの順番の
>結果的にはクリップボードに上から順番に並んでいたほうが直感的に
>正しいインターフェース(?)かな?と思ったからです。
 ↑
 気持ちは分かります。同じ考えです。
・でも私の環境では範囲選択してドラッグしている位置から順番に取得できました。
 例えば 1~20 のファイルを範囲選択して
 1 のファイルで右メニューすれば 1~20 の順番で
 10 のファイルで右メニューすれば 10~20、1~9 の順番で
 20 のファイルで右メニューすれば 20、1~19 の順番で
 取得できました。
 ※Windows XP Home SP2 の環境で順番に取得可能でした。参考に。
・あとエラーダイアログは OS の仕様でしょうね。
 渡せるフルパス領域は調べた結果では 2100 バイト前後ですのでパスが深い場合は
 例えば
 フルパスで 100 文字の場合では 2100÷100=21個渡せ、
 フルパスで 16 文字の場合では 2100÷15=131個渡せる
 事になる。
・多分は OS の制約でしょう。
 正確な文字数が分かりませんがどのソフトでも同じようなエラーダイアログが出ます。
 ファイル数を減らせば出来ます。また、圧縮/解凍ソフトでは先にウインドウを
 起動させてそこへドラッグ&ドロップするとファイル数に制限はなくなる。
 どうも仕組みが違うようだ。→ウインドウにドラッグ&ドロップした場合は HDROP の
 ハンドルで受け取れるから文字数(メモリ)の制約がないのかも。
・またファイルを範囲選択して右メニューで『コピー』を選択するとファイル名の情報が
 クリップボードにコピーされます。その後プログラムからクリップボードを取得すれば
 HDROP の情報をもらえます。これなら制約もなくなるがコピーした後にプログラムを
 起動させる手間がかかってします。

最後に:
・エクスプローラの右メニュー(『送る』ではない)の場所に項目を追加してシェル拡張
 として受け取ると範囲選択したすべてのファイルを受け取れるようです。
 そういうソフトを普段使ってファイル名、フルパス名をクリップボードにコピーしてます。
・ちょっと調べたらこのソフトでは 2698 個のファイルを受け取れてフルパス名の文字数は
 243,854 バイトになりました。よってシェル拡張として作成すれば良いようですが
 あまり詳しくありません。参考に。
・以上。

★アドバイス
>数を少なくすると、問題ないのでどこに原因があるのだろうと探っていた所でした。
 ↑
・私も圧縮/解凍ソフトで同様なエラーがでて驚いたことがあります。
 それで渡せる文字数に限りがあるのだと思いました。
 理由は既に書いていますがパスが深い場合は少なく、パスが浅い(C:\)の場合は
 たくさんのファイルを渡せましたので。今回、回答 No.4 で確認用のサンプルを
 作って文字数の限界値を計算してみました。→この質問をきっかけに。
>ドラッグ&ドロップの順番の
>結果的にはク...続きを読む

Qコンソールアプリ内でDosコマンドを使用したい

kirishima8と申します。
よろしくお願いします。

開発環境
WindowsVista business 32bit
Visual Studio 2005 VC++

Win32アプリでコンソールアプリで、Dosのコマンドラインを利用したいのです。
新たにbatファイル等を作成・実行するのではなく、ずっと同一のコンソールウィンドウを利用し、かつ、Dosコマンドをプログラム側から利用できたらと考えています。
コマンドプロンプトのような機能を、自分で作ったアプリに実装させたいというのが最終的な目標となります。

MSDNで調べてみたところ、WriteConsoleInput()や関連APIが見つかりました。
しかしながら、パラメータの説明が何を指すのかという点が、現時点で私には解り辛いです。

何らかの情報をお持ちの方、ご教授ください。

未熟者ですので、上記では内容が伝わらないかもしれません。
何か不明な点がございましたら、お尋ねになってください。
よろしくお願いします。

Aベストアンサー

★質問の意図が良くつかめませんでした。
>コマンドプロンプトのような機能を、自分で作ったアプリに実装させたいというのが最終的な目標となります。
 ↑
 本当にご自分で『コマンド・プロンプト』のようなシェル機能を実装したいのですか?
 単に『コマンド・プロンプト』で動くプログラムを実行したいだけなら回答者No.1さんの
 アドバイスにあるやり方で実行できます。
・ShellExecute()以外にもWinExec()、CreateProcess()やC標準関数のsystem()関数も使えます。
 Windowsプログラムにおいて一番お手ごろなのはShellExecute()でしょうね。
 使い方は
 ShellExecute( (1), (2), (3), (4) ,(5) ,(6) );
 (1)親ウインドウハンドル
 (2)操作文字列
 (3)コマンド名
 (4)パラメータ
 (5)作業ディレクトリ
 (6)表示状態
 こんな感じです。
・この質問はシェル機能を実装したいのか?
 DOSコマンドを単に実行したいのか?
 またはそれ以外なのか?
 補足して下さい。
・でわ。また。

★質問の意図が良くつかめませんでした。
>コマンドプロンプトのような機能を、自分で作ったアプリに実装させたいというのが最終的な目標となります。
 ↑
 本当にご自分で『コマンド・プロンプト』のようなシェル機能を実装したいのですか?
 単に『コマンド・プロンプト』で動くプログラムを実行したいだけなら回答者No.1さんの
 アドバイスにあるやり方で実行できます。
・ShellExecute()以外にもWinExec()、CreateProcess()やC標準関数のsystem()関数も使えます。
 Windowsプログラムにおいて一番...続きを読む

Qネイティブ ハンドルって...............

ネイティブ ハンドルってなんでしょうか?
ウィンドウ ハンドルを調べていたら出てきたのですが
調べてもわかりません
すいませんがどのようなものなのかお教え願えませんか?
よろしくお願い致します

Aベストアンサー

カテゴリ違いでは?
.NETですよね。

.NETでは、従来のウィンドウハンドルは基本的に使いません。
Windowsプラットフォームにネイティブなものだからネイティブハンドルと呼んでいるのでしょう。

QCのコンソールアプリ

Cを勉強し始めて1ヶ月ほどになります。

[a]
メインメニュー
(1)○○開始
(2)○○終了
(3)×××
(4)△△△
(9)プログラムの終了
処理番号入力:_

[b]
○○開始 ESCでメインメニューへ戻る
(1)○○開始
(2)キャンセル
処理番号入力:_

コンソールアプリで[a]のようなメインメニューがあり
[b]のような画面でキャンセルの選択やESCを押した場合などに
「メインメニューに戻る」動作をさせたいのですが、
forやwhileを使えばいいのでしょうか?
なかなかイメージが出来ていなくて教えていただけるとありがたいです。

環境はVisual C++ 6.0です。

Aベストアンサー

「状態遷移」という概念を理解すると、多少楽になります。

全体の構成は、

while(1)
{
キーを読み込む
状態を遷移させる
今の状態における処理をする
}

という流れになります。

「キーを読み込む」は、getchar() などが使えそうです。

「状態を遷移させる」
というのは、「今の状態(メインメニューだとか、次のメニューだおとか)」と「入力されたキー」から、「次の状態」を決定します。

switch(今の状態)
{
case メインメニュー :
if (入力 == xxx) 次の状態に変化
....
}
こんな感じ。

最後に、「今の状態の処理」は、変更された「状態」にあわせて処理をします。


この方法だと、ソースの量は増えますが、一度にデバッグする範囲を狭くすることができます。

QCコンソールアプリ3

yymmddhhmmss.txt(例.060125162541.txt)という形式のテキストファイルが
実行ファイルの直下の「txt」フォルダにたくさんあり、
txtファイルには下記のように情報があります。


172.20.1.31,2879,207.46.248.109,80
...GET /cgi-bin/~ref+ HTTP/1.1..Accept: */*..Referer: http:w
ww.j-motto.info/~.html...Accept-Langua: ja..Accept-Encording: gzip, de
flate..User-Agent: Mozila/4.00 (compatible~NT5.0)..Host: ad.jp.ap.vali
ecommerce~.........


1行目には「自IP」「自ポート」「相手IP」「相手ポート」がカンマ区切りで、
下の行にはパケット情報が書き込まれています。

YYYYMMDDの形で日付入力を待ち、それに該当する日付のファイルがあれば読み込んで、


(06/01/25)
[Get]
 /cgi-bin//cgi-bin/~ref+ HTTP/1.1
 
[Referer]
 http:www.j-motto.info/~.html

[User-Agent]
 Mozila/4.00 (compatible~NT5.0)

[Host]
 ad.jp.ap.valiecommerce~


のように表示させたいのです。
fscanf()等で読み込んで範囲を指定して一部だけを
表示させることは可能でしょうか?

yymmddhhmmss.txt(例.060125162541.txt)という形式のテキストファイルが
実行ファイルの直下の「txt」フォルダにたくさんあり、
txtファイルには下記のように情報があります。


172.20.1.31,2879,207.46.248.109,80
...GET /cgi-bin/~ref+ HTTP/1.1..Accept: */*..Referer: http:w
ww.j-motto.info/~.html...Accept-Langua: ja..Accept-Encording: gzip, de
flate..User-Agent: Mozila/4.00 (compatible~NT5.0)..Host: ad.jp.ap.vali
ecommerce~.........


1行目には「自IP」「自ポート」「相手...続きを読む

Aベストアンサー

1.ファイルのリストを作る
2.日付を入力させる
3.リストから一致するものを探す
4.そのファイルの内容を表示

という流れになりましょうか。
すべてのファイルで一行目の構造が同じなら、一行目をfgets()するなりして、strtok()で切り出すと良いかもしれません。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報