アプリケーションを開発しています

開発環境
Microsoft Visual Studio 2005
net framework 2.0
C#

GUI(Windows アプリケーション)とCUI(コンソールアプリケーション)の
アプリケーション開発しています

単体のアプリケーションは動作しています

2つのアプリケーションを1つの(EXE)で実行できるアプリケーションを
開発したいです

起動仕方は
EXE にパラメータを付けたらCUIで起動して
パラメータなしならばGUIで起動したいです

プログラムで起動の仕方を判断できるのですか?
できるなら参考資料(サンプルコート・ホームページなど)を教えて下さい

宜しくお願いします。

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

A 回答 (4件)

フォームアプリケーションに設定して、



[DllImport("Kernel32.dll")]
static extern bool AllocConsole();

[DllImport("Kernel32.dll")]
static extern bool FreeConsole();

if (args.Length == 0)
{
Application.Run(new Form1());
}
else
{
AllocConsole();
Consol.WriteLine("HogeHoge");
FreeConsole();
}

としてやる方法もありますが、この方法の場合、コマンドラインから実行したときにも別のコンソールが作成されます。

あと、親プロセスのコンソールにアタッチしてやることも可能です。
これもフォームアプリケーションでビルドしてください。
とりあえず、親が "cmd" かどうかで判定しています。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Test
{
static class Program
{

[DllImport("Kernel32.dll")]
static extern bool AllocConsole();

[DllImport("Kernel32.dll")]
static extern bool FreeConsole();

[DllImport("Kernel32.dll")]
static extern bool AttachConsole( int processHandle );

private const int ATTACH_PARENT_PROCESS = -1;

[STAThread]
static void Main(string[] args)
{
if (args.Length == 0)
{
Application.Run(new Form1());
}
else
{
Process p = Process.GetCurrentProcess();
PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName);
Process parent = Process.GetProcessById((int)pc.RawValue);

if (parent.ProcessName.Equals("cmd"))
{
AttachConsole(ATTACH_PARENT_PROCESS);
}
else
{
AllocConsole();
}

Console.WriteLine("HogeHoge");

if (!parent.ProcessName.Equals("cmd"))
{
FreeConsole();
}
}
}
}
}

この回答への補足

tsukasa-12r さん回答ありがとうございました

PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName);
この部分はちょっと時間がかかりますね

コマンドプロンプトで実行すると最後のカレント表示がされません
しかしリターンキーを押すとカレントが表示されます
何か実行中見たいて聞きなりましたのでネットで調べましたけどわかりませんでした
解決する方法はあるのですか?

宜しくお願いします

補足日時:2011/04/16 20:46
    • good
    • 0

ちょっと無理やりっぽいですが、こんな感じで、どうでしょう。



using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Test
{
static class Program
{
[DllImport("User32.Dll")]
static extern int ShowWindow( IntPtr hWnd, int nCmdShow );

private const int SW_HIDE = 0;

static void Main(string[] args)
{
if (args.Length == 0)
{
Process p = Process.GetCurrentProcess();
IntPtr hwnd = p.MainWindowHandle;
ShowWindow(hwnd, SW_HIDE);

Application.Run(new Form1());
}
else
{
Console.WriteLine("hogehoge");
}
}
}
}

この回答への補足

tsukasa-12r さん回答ありがとうございました
todo36 さんにお礼を記載していませんでしたので今回こちらで
お礼させてもらいます

コンソール アプリケーションで作りました
こちらのサンプルで実行すると一瞬コマンドプロンプが表示されてしまいます

コマンドプロンプを完全に消すことできませんか?

自分でもわかる範囲で実験してみましたけど完全に消すことできませんでした

わかる方はテクニックを教えて下さい

補足日時:2011/04/16 07:31
    • good
    • 0

Windows アプリケーションプロジェクト



Formを表示せずにConsoleを出すときは↓の後半参照
http://dobon.net/vb/dotnet/programing/consoleino …

この回答への補足

static void Main(string[] args)
{
System.IO.StreamWriter standard = new System.IO.StreamWriter(Console.OpenStandardOutput());

// 自動的にフラッシュされるようにする
standard.AutoFlush = false;

// Consoleの出力ストリームを変更する
Console.SetOut(standard);

if (args.Length == 0)
{
Application.Run(new Form1());
}
else
{
for (int i = 0; i < args.Length; ++i)
{
Console.WriteLine("hogehoge-" + args[i]);
}
Console.WriteLine("hogehoge-end");
}
}

でプログラム作成しましたけど
コマンドプロンプトで(WindowsApplication1.exe A B)しても何も表示しません

いまいち使い方がわかりません

補足日時:2011/04/15 21:38
    • good
    • 0

まず、プロジェクトのプロパティーの「アプリケーション」タブの「出力の種類」を「コンソール アプリケーション」にします。


次に、Program.csを
static void Main(string[] args)
{
if (args.Length == 0)
{
Application.Run(new Form1());
}
else
{
Console.WriteLine("hogehoge");
}

のような感じにすれば良いと思います。

この回答への補足

tsukasa-12r さん回答ありかとうございました
確かにこのようにすると希望の通りになります

GUI アプリケーションの時はコマンドプロンプトの
画面も機動しています

コマンドプロンプトを隠すことできますか?

宜しくお願いします

補足日時:2011/04/15 19:19
    • good
    • 0

この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現在、Ubuntu上で動くGUIアプリケーションをCもしくはC++で作

現在、Ubuntu上で動くGUIアプリケーションをCもしくはC++で作成したいと考えています。
そこでwindows上ではwindows.hといったようにOS依存のライブラリがあると思うのですが
Ubuntuではどのようなライブラリを用いるのが良いでしょうか。

Aベストアンサー

GUIライブラリならGTK+やQTなど
見た目に関してだけど
GNOMEを使っているならGTK+の方が良いでしょうし
KDEを使っているならQTの方が良いでしょう。

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

QC++とC#を使ったアプリケーション作成

アプリケーションと言って良いのかは微妙なのですが、アプリケーションを作ることになりました。
既存のいくつかのプログラムを1つにまとめて、GUIで操作できるようにするのが最終目的です。

もとのプログラムはC++で書かれています。
今回は、GUIの部分を
「Microsoft Expression Blend 2」でデザインしようと考えているのですが、
GUIの部分をC#で作成し、メインの処理をC++で書くことは可能なのでしょうか?
それとも、メインの処理をC#で書き直すことが必要でしょうか?

知恵を貸してください。
よろしくお願いします!!

Aベストアンサー

> メインの処理をC++で書くことは可能なのでしょうか?

C++/CLI使えばC#/VBとすんなり繋がります。

QC++ C# 語源

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

Aベストアンサー

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

QC#2005からC++ネイティブコードのDLLをコール後のフォームアプリケーションの応答について

お世話になります。
Windows7Pro環境で、C#2005のWindowsフォームから、C++ネイティブコードのDLLを呼び出す処理を作成しております。

ソースコードは以下の通りです。

[DllImport("xxxxxx", EntryPoint = "aaa", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern Int32 aaa
([MarshalAs(UnmanagedType.LPStr)] string s1,
Int32 i1,
Int32 i2,
Int32 i3,
[MarshalAs(UnmanagedType.LPStr)] string s2,
[MarshalAs(UnmanagedType.LPStr)] string s3);

private void Method()
{
Int32 iRet = aaa(strQscuIniFilePath, 1, 1, 1, strMoveKinsClientTemp, null); ←①
}

①の処理が10秒から60秒かかり、①の処理中にWindowsフォームを何回かクリックすると、
画面が白色になり(フリーズしている状態)、その後OS標準の「xxxは応答していません」のダイヤログが出力されます。

この現象を回避する方法はございますでしょうか。
恐れ入りますがご教示いただければ幸いに存じます。

以上宜しくお願い致します。

お世話になります。
Windows7Pro環境で、C#2005のWindowsフォームから、C++ネイティブコードのDLLを呼び出す処理を作成しております。

ソースコードは以下の通りです。

[DllImport("xxxxxx", EntryPoint = "aaa", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern Int32 aaa
([MarshalAs(UnmanagedType.LPStr)] string s1,
Int32 i1,
Int32 i2,
Int32 i3,
[MarshalAs(UnmanagedType.LPStr)] string s2,
[MarshalAs(UnmanagedType.LPStr)] string s3);

private void Method(...続きを読む

Aベストアンサー

メインスレッドから呼び出しているなら10秒後osが
プロセスを「固まった」と認識してしまいます。
スレッドの使用を検討すべきでしょう。

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#の方が簡単です。)

QCUI環境でのCプログラム ランダムアクセスが分からない

CUI環境でのCプログラムを作っています。
data.txtファイルの末尾に文字を追加させるプログラムを作っています。
---data.txtの中身-------
あああ
いいいいい
うううううううう
ええ
------------------------
このdataファイルの末尾にコマンドプロンプトから文字を追加させるには、ランダムアクセスを使えばいいと思うんですが、どのようなプログラムにすれば良いのか分かりません。ランダムアクセスはバイナリファイルでしか使えないのでしょうか?

Aベストアンサー

★追加書き込みモード『a』でオープンすれば良い。
・ファイルの末尾に文字列を追加したいだけならば、ランダムアクセスする必要は全く
 ありません。fopen 関数で『w』ではなく『a』でオープンします。
・あとランダムアクセスはテキストファイルでもバイナリファイルでも両方可能ですよ。

サンプル:
FILE *fp;

if ( (fp = fopen(filename,"a")) != NULL ){
 fputs( "コマンドらいから取得した文字列", fp );
 fputs( "\n", fp );
 fclose( fp );
}

解説:
・普通、書き込みは『w』モードですが、追加書き込みを行いたい場合は『a』モードでオープンします。
 あとは追加したい文字列を出力して『\n』も書き込んでおきましょう。→多分、行単位でファイル末尾に
 追加したいのでしょうから『\n』を出力します。fgetc 関数でも出力できます。
・なお、ランダムアクセスで操作を行いたい場合は『a+』モードでオープンしてから、ファイルの末尾に
 fseek 関数などで移動してから文字列を追加すれば出来ます。
・以上。参考に!→下の『参考URL』をどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/c/sec17.html

★追加書き込みモード『a』でオープンすれば良い。
・ファイルの末尾に文字列を追加したいだけならば、ランダムアクセスする必要は全く
 ありません。fopen 関数で『w』ではなく『a』でオープンします。
・あとランダムアクセスはテキストファイルでもバイナリファイルでも両方可能ですよ。

サンプル:
FILE *fp;

if ( (fp = fopen(filename,"a")) != NULL ){
 fputs( "コマンドらいから取得した文字列", fp );
 fputs( "\n", fp );
 fclose( fp );
}

解説:
・普通、書き込みは『w』モードで...続きを読む

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++でGUIアプリケーションを作成するには?

C++でGUIアプリケーションを開発しようとしていますが、どのように作成すればよいのかわからなかったため、質問させて頂きました。

アプリケーションのイメージとしては、ボタン・背景などはすべてこちらの用意した画像で表示し、Windowsっぽいテイストは一切出さないアプリケーションです。ボタンを押すと画面全体が切り替わるイメージです(例えばプリクラみたいな)

現在JavaのSwingでアプリを作成しており、全体が切り替わる機能としてはJPanelのCardLayoutを使用しています。
ボタンはJButton等で完全に画像onlyのアプリを実現しています。
ただ、JavaはWEBカメラからの画像取得が640*480が限界であり、カメラの限界性能(1600*1200等)が使用できるopencv(c++)で画像キャプチャのところだけ作成しました。

このままアプリ全体はJavaで作成し、画像キャプチャ時はc++のexeを裏で実行させるという方法もあるのですが、言語を統一したほうがいいのではないか?と思ったので現在c++でGUIアプリの作成方法を調べています。

参考になるページもご紹介いただけるとありがたいです。

C++でGUIアプリケーションを開発しようとしていますが、どのように作成すればよいのかわからなかったため、質問させて頂きました。

アプリケーションのイメージとしては、ボタン・背景などはすべてこちらの用意した画像で表示し、Windowsっぽいテイストは一切出さないアプリケーションです。ボタンを押すと画面全体が切り替わるイメージです(例えばプリクラみたいな)

現在JavaのSwingでアプリを作成しており、全体が切り替わる機能としてはJPanelのCardLayoutを使用しています。
ボタンはJButton等で完全に画...続きを読む

Aベストアンサー

JNI


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

人気Q&Aランキング