こんばんは。
以前にも質問したのですが、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と関連する良く見られている質問

QC++とC#

C,C++と進みC#
Visual C#がありますが
C++とC#の違いを教えてください.
C++とJAVAをたしたようなもの
なのでしょうか?

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 で確認用のサンプルを
 作って文字数の限界値を計算してみました。→この質問をきっかけに。
>ドラッグ&ドロップの順番の
>結果的にはク...続きを読む

QC#とC++/CLIの連携について

C#とC++/CLIの連携について
C++/CLI側にC#で作成した変数を渡したいのですが、やり方がわかりません。

そもそも一つのソリューションにC++/CLIとC#を混在することはできるのでしょうか。
やはりC++/CLI側はDLLにして、C#がそのDLLを利用するのでしょうか。

Aベストアンサー

.NETの各種言語は混在することができます。
たとえば、C#でGUIの設計をし.NET用DLLを作成し、内部処理をC++でWin32APIを使って書き、C++/CLIでラップして、GUIと結び付ける、とかもできます。

「変数を渡す」というのが表現として良く分かりませんが、変数というよりはクラスを共有する感じになるかと思います。

とはいえC++/CLIはネイティブコードとマネージドコードを混ぜれるがゆえに、逆に色々と問題があるので、ちゃんとネットや本で調べたほうが良いかと思います。

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プログラムにおいて一番...続きを読む

QC++ C# 語源

C++とC#(C++++)はかなり大雑把に言うとCの拡張版ですが、なぜ+が二個単位なのでしょうか。
C → C++ → C#
C+とC+++は存在しないのでしょうか。
C → C+ → C++ → C+++ → C#
もし存在しないのであれば、どのような理由でそうなったのでしょうか。

Aベストアンサー

C/C++のインクリメント演算子が、++だからじゃないでしょうか。

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

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

Aベストアンサー

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

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

QC#でできてC++でできないことは?(C#のメリットとは?)

これから新しい言語として、C#もしくはC++の勉強をしたいと
考えています。

C#にできてC++にできないこと、あるいはその逆でC++にはできて
C#ではできない。ということがあれば、教えていただけないでしょうか?

感覚としてはC++であれば何でもできるという感じではあるのですが、
C#を使うメリットってどんなことがありますか?
やはり、ビジュアル開発(コントロールのDrag&Dropで画面開発ができる)
の簡単さというところがC#でのメリットでしょうか?

ちなみに私はこれまで、C -> VB -> Java といった順で言語を習得
してきました。

Aベストアンサー

>C#にできてC++にできないこと
無いでしょう。
基本的にC/C++の場合コンパイラの種類に依りますが
内部にアセンブラを書くこともできますから
C/C++で出来ないことはC#でも出来ません。
(勿論#1さんの言われるように言語レベルの仕様で出来ない事はあります。)

簡単さでいうとC#です。VB6の開発経験があるとのことですが
VC#だとVBのフォームを作成するような感じでインターフェースを
作っていけます。(一応VC++でも可能)

一方C#で出来ないことですが
当然ですがフレームワークに依存しないソフトを作る事が出来ません。
Javaで作ったソフトがJREを必要とするのと同じです。
他にはCPUの特殊な命令(SSEやMMX)を呼び出すとかドライバの開発等も出来ません。

ちなみにVC++でもフレームワークは使えるので
フレームワークのガベージコレクション等を使うことは可能です。
(ただフレームワークを使うならC#の方が簡単です。)

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#でCのコンソール出力の取得

C#でCのコンソール出力の取得
Cで作成したDLLをC#で利用しています。このときDLLファイルはC言語のprintfを使用しています。この出力内容を取得して、C#でテキストボックス等に表示する方法はありませんでしょうか。

Aベストアンサー

使ったこと無いのですが
Googleで調べたところ以下のWebページがヒットしました。

@IT
.NET TIPS
コンソール・アプリケーションの出力を取り込むには?[C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html

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ランキング