- PR -

Windowsアプリケーションのコマンドラインからの起動

投稿者投稿内容
赤いんげん
会議室デビュー日: 2006/08/29
投稿数: 10
お住まい・勤務地: 東京都
投稿日時: 2007-02-05 00:57
お世話になっております。
既存WindowsAP(VB.NET2005で作成)をコマンドラインからも
起動できるよう改造しようとしています。

既存APはFORMが立ち上がった後「実行ボタン」を押下すると処理が開始し、
処理メッセージをTEXEBOX内に表示します。
これをコマンドラインから起動する場合に、FORM自体を表示せずに処理を開始し、
処理メッセージをDOSプロンプトへ表示させたいと思っています。

そこでMainメソッドを実装し、メッセージ出力部を
モードで振分けるようにしました。(下記のコーディング参照)

VisualStudio上のデバッグでは上手く動作しているように見えたのですが、
DOSプロンプトで「> APP.exe CMDMODE」と入力して実行すると、
処理メッセージが表示されずに、すぐに次の入力プロンプトが表示されてしまいます。
ただし、タスクマネージャを見ると、APP.exeのプロセスは裏で動いています。

FORMが表示されないだけのAPP.exeを起動している状態のようで、
どこにもメッセージが出力されていません・・・

どのように対処すれば、DOSプロンプトにメッセージが表示されるのでしょうか。
どなたかよろしくお願いします。


Shared Sub Main(ByVal CmdArgs() As String)
  
  (引数でコマンドラインモードか判定)
  
  'コマンドラインモードの場合
  If cmdMode Then
    mainForm.mainLogic()    'メイン処理
  'WindowsFORMの場合
  Else
    Application.Run(mainForm)  'FORMの表示
  End If
End Sub

'メッセージ出力関数(モードで出力先振分)
Public Sub consoleOut(ByVal msg As String)
  'DOSプロンプトへ表示したい → 表示されない・・・
  If cmdMode Then
    Console.WriteLine(msg)
  Else
    me.TextBox1.AppendText(msg & VbCrlf)
  End If
End Sub

[ メッセージ編集済み 編集者: 赤いんげん 編集日時 2007-02-05 00:59 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-05 07:24
コマンドプロンプト用のアプリケーションとして作成。
その中で、引数によってウィンドウをだす
_________________
赤いんげん
会議室デビュー日: 2006/08/29
投稿数: 10
お住まい・勤務地: 東京都
投稿日時: 2007-02-06 00:27
Jitta様

アドバイスどうもありがとうございます。
プロジェクトのプロパティ画面で、「アプリケーションの種類」を「Windows
アプリケーション」から「コンソールアプリケーション」へ変更したところ、
DOSプロンプト上に出力することができました。

がしかし、EXEファイルをダブルクリックして起動すると、一度DOSプロンプトが開いて、
その上でメインFORMが表示されるようになりました。(当たり前かもしれませんが。)

黒いDOSプロンプトが残ったまま、WindowsFORMが別画面で開かれています。
ワガママかもしれませんが、あまりカッコイイ起動ではないように思います。

WindowsアプリケーションからDOSプロンプトへ表示する方法、もしくは、
DOSプロンプトからFORMを起動し、その後DOSプロンプトだけを消す方法は
ありませんでしょうか。よろしくお願いします。

[ メッセージ編集済み 編集者: 赤いんげん 編集日時 2007-02-06 00:32 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-02-06 06:52
いちばん簡単なのはアプリケーションを3つにわけてしまうことですよ。本体となるDLL、コンソールUIとなるEXEファイル、グラフィカルUIとなるEXEファイルに分けるなら、何も難しい事は考えなくてよいよね。

もしひとつの実行ファイルであなたが望んでいることを実現しようとするなら、ランタイムルーチンを書き換える必要があると思う。私だったら絶対やりたくない。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-06 10:00
(私が考える) 1 番簡単な方法は、
  1. コンソール アプリケーションを 1 つ追加する
  2. Windows アプリケーションの方では、このコンソール アプリケーションを起動する
  3. 起動したコンソールの StandardInput を System.Console.Out に Set する
  4. Windows アプリケーションから System.Console.Write
  5. (゚Д゚)ウマー
だと思います。

これならば、Windows アプリケーションの方の実装は、ほとんどそのままにできるはずです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-02-06 12:14
試したこと無いんですが

[quote]

  1. 起動したコンソールの StandardInput を System.Console.Out に Set する
  2. Windows アプリケーションから System.Console.Write


で、うまいこと標準入出力がつながるもんなんですか?

GUI アプリの STDIN, STDOUT は、デフォルトで NULL が入っていたような気がするんですが。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-06 14:06
引用:

渋木宏明(ひどり)さんの書き込み (2007-02-06 12:14) より:

で、うまいこと標準入出力がつながるもんなんですか?
GUI アプリの STDIN, STDOUT は、デフォルトで NULL が入っていたような気がするんですが。。。


標準入出力に直接つながることは、たぶんないでしょうね。
("STDIN と STDOUT が NULL" という点は良くわかりませんが)

Windows アプリケーションから Write された文字列は、Read すれば、
コンソール アプリケーション側で取得することはできるでしょうけど...
...取得しても、その後コンソールに出力する手立てがないですね。(横取りされるので)

やはり、コンソール アプリケーションに参照を追加してロジックを呼び出した方が良いような気がします。orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-02-06 18:16
こんにちは。

引用:

赤いんげんさんの書き込み (2007-02-06 00:27) より:
WindowsアプリケーションからDOSプロンプトへ表示する方法、もしくは、
DOSプロンプトからFORMを起動し、その後DOSプロンプトだけを消す方法は
ありませんでしょうか。よろしくお願いします。



Windows XP以降の環境であれば、
AttachConsole関数が使えるので↓の方法が使えます。
http://q.hatena.ne.jp/1106205741


#以前わたしもWindowsアプリケーションでコンソール出力する
 プログラムを開発したことありますが、
 Windows XPより前で、どうやっていたか忘れてしまいました(-_-;)
 どっかにソース残ってないかなぁ(独り言)

スキルアップ/キャリアアップ(JOB@IT)