- PR -

まったく画面が出ないバッチプログラム

投稿者投稿内容
momo
常連さん
会議室デビュー日: 2006/11/06
投稿数: 35
投稿日時: 2007-09-06 19:30
環境は
VS2005 C#
開発OS:WindowsXP
実際の稼動時のOS:Windows Server 2003
です。

現在、別サーバ上のWebサービスとのやり取りを行うバッチプログラムを作成しようとしています。
このバッチは別プロセスからキックされます。
サーバ上で動くオンラインバッチなので一切画面の表示を行いたくありません。
しかし、コンソールアプリケーションでごく簡単なサンプルを作ったところ
プロンプト画面が表示されてしまいます。

・作ったサンプル
static int Main(string[] args)
{
Thread.Sleep(100);
return (5);
}


一切の画面表示を廃したバッチ処理exeを作成するにはどのような方法が最適なのでしょうか?

考えてみたのは

(1)Windowsアプリケーションで作って、Application.Run(New Form1);しないで、別のメソッドをコール?
(2)コンソールアプリケーションでつくって、プロンプト画面を表示させない方法がある?
(3)その他

でした。

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-09-06 20:28
なぜWindowsアプリケーションなる言葉が出るのか不明。
空のプロジェクトにクラスを追加してmain書いてそこでバッチ処理を書くでいいんでない?
もちバッチ処理は処理単位でメソッド分けするってことでどうよ?
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-09-06 20:31
引用:
(2)コンソールアプリケーションでつくって、プロンプト画面を表示させない方法がある?



呼び出し方によって変わってきます。
表示しないように呼び出せばいいだけです。
_________________
momo
常連さん
会議室デビュー日: 2006/11/06
投稿数: 35
投稿日時: 2007-09-06 23:01
現在開発環境のないところにいるので、精しく検証しないまま返信します。

>ぶさいくろう さん
windowsアプリと考えたのはこれならプロンプトは出ないかもと考えたからです。

exeにビルドするために、Windowsアプリ、コンソールアプリ、クラスライブラリのどれかを
選択しなくてはならないと思っていたのですが違うのでしょうか。


>ちゃっぴ さん
サンプルのコンソールアプリexeは、別の.netのWinアプリから

System.Diagnostics.Process ps = System.Diagnostics.Process.Start("c:\\abc.exe");
ps.WaitForExit();

の形で暫定的に起動しています。
ただexeを起動しているだけのつもりなのにプロンプトが出てしまうのです。
呼び出し側でのみしか制御できないのでしょうか。
呼び出し側にあまり依存させたくないのです。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-09-07 00:25
そもそも別の process で起動する必要ありますか?

無いのであれば、DLL にしてやったほうがはるかにいいでしょう。
自分で作った application から自分で作った exe を呼び出すなんてのは出来るだけ避けたほうがいいです。

引用:

ただexeを起動しているだけのつもりなのにプロンプトが出てしまうのです。



Desktop session を持っている user が普通に console application を呼び出せば prompt が表示されます。Desktop session を持っていない user が起動すれば、当然 prompt を表示することが出来ないわけです。

これが Windows の仕様です。

<参考>
CreateProcess
Process Creation Flags
ProcessStartInfo メンバ


_________________
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-09-07 10:15
Process.Startを使うのがいいかどうかは置いといて。
Process.Startを実行する前にProcessStartInfoで設定することでコマンドプロンプトを表示させないようにすることは可能です。
http://codezine.jp/a/article/aid/83.aspx
この記事が参考になるかな。
momo
常連さん
会議室デビュー日: 2006/11/06
投稿数: 35
投稿日時: 2007-09-07 20:16
皆さんありがとうございます。

引用:

そもそも別の process で起動する必要ありますか?

無いのであれば、DLL にしてやったほうがはるかにいいでしょう。
自分で作った application から自分で作った exe を呼び出すなんてのは出来るだけ避けたほうがいいです。


私もDLL化したいのはやまやまなのですが、実際の呼び出し側は(別会社の)別パッケージ内に
作られる予定で、Webサービス呼び出しバッチ処理をDLL化したとしてもそれを参照して使用
するのは不可なのだそうです。

引用:

Process.Startを実行する前にProcessStartInfoで設定することでコマンドプロンプトを表示させないようにすることは可能です。


System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = Application.StartupPath + "C:\\abc.exe";
p.Start();

の形でやってみましたが、やはりコンソールが表示されてしまいました・・・。

引用:

単に、
csc /target:winwxe hoge.cs
でコンパイルするんじゃ駄目なの?


コマンドプロンプトからビルドするということですか?


とりあえず、コンソールアプリのテンプレートで作ったサンプルを、
その後で出力の種類をWindowsアプリケーションに変えてビルド&実行したところ、
ウィンドウは出なくなりました。(前述した(1)に近い方法だと思うのですが。)
問題なさそうならこれで行きたいのですが、良くない方法なのでしょうか。

昔のVB6でいうbasのみのexeみたいにしたいのに、なかなか参考資料が見つけられなくて
困っています。
.netで実現できないのは私が.netやWindowsの仕様の理解度が低いからなのでしょうが・・・。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-09-07 21:04
メッセージポンプを動かさなくていいなら、Application.Run をしなければいい。


バッチ実行中は、Windows が終了できなくなる(と思う)。

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