VisualC++6.0を用いて、ダイアログの2つあるプログラムを
作ったのですが、
2つのダイアログを例えばAさん用、Bさん用として使い分けようと思ったときに
メニューでダイアログをそれぞれ指定して、実行しようと思ったのですが、
Aさん用を親ダイアログにしてしまうと、Bさんは起動時ごとにメニューで
切り替えなければいけなくなりますよね。
それで、切り替えをしなくても良いようにと思って、
コマンドラインからパラメータで「/A」「/B」などとしたときに、Aさん用
Bさん用として、起動させたいのですが、
コマンドラインのパラメータをどこで受け取って処理しているのか
分らないのですが、教えては頂けないでしょうか?
よろしくお願い致します。

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

A 回答 (3件)

補足です。


WinAPPクラスInitInstance関数のなかで、
>CCommandLineInfo cmdInfo;
>ParseCommandLine(cmdInfo);
の記述があればそのあとでパラメータの解析を行います。>>m_lpCmdLineです。

もし、作成中のプロジェクトにこの記述がない
(InitInstance関数がない等の)場合は、
CCommandLineInfoクラスの継承クラスをつくって
仮想関数
virtual void CCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
を実装しましょう。

たとえば・・・

CWinApp theApp;
using namespace std;


// コマンドライン解析クラス
class CMyClass : public CCommandLineInfo{
public:
virtual void ParseParam(LPCTSTR, BOOL, BOOL);
};

//コマンドラインの個々のパラメータを解析および解釈するために、フレームワークが呼び出します
void CMyClass::ParseParam( LPCTSTR lpszParam, BOOL bFlag, BOOL bLast )
{
CString strTemp = _T(lpszParam); // パラメータ、またはフラグ
return;
}

void
main()
{
CMyClass info;
theApp.ParseCommandLine(info);
}

では^^。
    • good
    • 0

((CMyApp*)AfxGetApp())->m_lpCmdLine;


を使ってはいけないのでしょうか?
    • good
    • 0

CWinAppクラスのメンバであるLPTSTR m_lpCmdLineがコマンドライン引数ですので


CHogehogeAppクラス(Hogehogeはプロジェクト名と同じ)のm_lpCmdLineメンバにアクセスすればコマンドライン引数を取得する事が出来ると思います
    • good
    • 1

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

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

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

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

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

QC言語において、関数とその役割、また、引数とその役割、仮引数、実引数とは?

C言語初心者です。
そもそもPC使うのも苦手ですがよろしくお願いします。
C言語において、関数とその役割、また、引数とその役割、仮引数、実引数の役割を、実例を用いて簡潔に説明していただけると助かります。お願いします。

Aベストアンサー

そんなに一気に理解しようとしても難しいですね。
http://www.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
を眺めてみてください(仮引数と実引数の意味が書いてある。ただしC言語であんまり仮引数がとか実引数が、という言い方はしないような)。
C言語においては全ての処理のかたまりが「関数」です。関数は何かの処理を行って値を返すことも返さないこともあります。
ここの例でいうとf(int x)は値を返す関数、main()は返さない関数で、ここからプログラムの処理が始まります(そういうルールになっている)。
このページのプログラムはちょっと古い書き方なんで今だと警告が出る可能性があります。

Qダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

Win2000/MFC/ダイアログベース
で作業しています。初心者です(^^;)

Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押した時にBダイアログとCダイアログを閉じたい(消したい)のですが
EndDialogで消せません
DoModalの戻り値をret_b,ret_cとした場合
EndDialog(ret_c);
EndDialog(ret_b);
としたのですが。。。

やり方がおかしいのか、よくわかりません・・
初心者でもわかりやすいお返事お待ちしています(^^;)

Aベストアンサー

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。

CDlgA --- A というダイアログボックス
CDlgB --- B というダイアログボックス
CDlgC --- C というダイアログボックス

CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値が先の CDlgB::DoModal() の戻り値となります。
戻り値がある特定の値だったとき、つまり、質問の例ではダイアログボックス B で EndDialog(ret_b) が実行されたことが特定できたときに CDlgA も EndDialog() を実行すれば連鎖してダイアログボックスを閉じることができます。
ダイアログボックス C についても同様です。

実際のコーディングでは次のようになると思います。
ただし、ダイアログボックス A もモードレスで表示されていると仮定しています。



#define ret_b (-1) // 特定の値
#define ret_c (-1) // ID_OK や ID_CANCEL と重ならないように注意

...

(CDlgA の実装)

void CDlgA::OnButtonA() // あるボタン a が押されたときの処理
{
CDlgB dlg; // ダイアログボックス B

if (dlg.DoModal() == ret_b) // モードレスで表示して、戻り値をチェック
EndDialog(-1); // ダイアログボックス A を閉じる
}

...

(CDlgB の実装)

void CDlgB::OnButtonB() // あるボタン b が押されたときの処理
{
CDlgC dlg; // ダイアログボックス C

if (dlg.DoModal() == ret_c) // モードレスで表示して、戻り値をチェック
EndDialog(ret_b); // ダイアログボックス B を閉じる
}

...

(CDlgC の実装)

void CDlgC::OnButtonC() // あるボタン c が押されたときの処理
{
EndDialog(ret_c); // ダイアログボックス C を閉じる
}

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。

CDlgA --- A というダイアログボックス
CDlgB --- B というダイアログボックス
CDlgC --- C というダイアログボックス

CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値...続きを読む

Qc言語 関数 変数 引数 とは何なのか

関数、変数、引数のそれぞれの機能と三つの関係性をわかりやすく教えてください

Aベストアンサー

数学の用語と同じです。
数学で言うと、
2x + y + 3 = 0
のような式で、x や y という文字が変数です。
y = f(x)
この f が関数で、x が引数(変数でもある)、y が関数の値(変数でもある)。

Cだと、
ch = getchar();
ch が変数、getchar が関数、この場合は引数は無し。

n = printf("%d",x);
printf が関数、"%d" が引数、x も引数、x はまた変数でもある。n も変数です。

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Q引数をつけたマクロ定義とは

引数つきマクロ宣言って、どういった場面で使うのでしょうか?

例えば

#define abc(a) a*a と定義している場合
x=abc(a) のabc(a)がa*aに変わる。

でも、こんなことしたら
abc(a)関数を呼び出せなくなるのでは?

要するに、「引数つきのマクロ定義が
ある理由などを、説明していただければと思います。

Aベストアンサー

マクロというのはコンパイルの時点で、「あらかじめ定義しておいた文字列に置換される」ということで、関数とは全く意味が違ってきます。

ご質問の、引数つきマクロについてですが、例えばこんなことをしたかったとします。

sprintf(abc->pqr, "%04d", 4);
strcpy(abc->xyz, "abc");
sprintf(def->pqr, "%04d", 5);
strcpy(def->xyz, "def");
sprintf(ghi->pqr, "%04d", 6);
strcpy(ghi->xyz, "ghi");


引数つきマクロでこんな風に書けます。

#define SCPY(XXX, YYY, ZZZ) \
sprintf(XXX->pqr, "%04d", YYY); \
strcpy(XXX->xyz, ZZZ)

SCPY(abc, 4, "abc");
SCPY(def, 5, "def");
SCPY(ghi, 6, "ghi");

3つの操作の異なる部分だけを記述するため、見やすくなったでしょう。見やすいソースというのはバグを少なくするコツでもありますので、上手に使って下さい。
マクロは置換されるだけなので、構造体名だろうが文字列だろうがOKです。

マクロというのはコンパイルの時点で、「あらかじめ定義しておいた文字列に置換される」ということで、関数とは全く意味が違ってきます。

ご質問の、引数つきマクロについてですが、例えばこんなことをしたかったとします。

sprintf(abc->pqr, "%04d", 4);
strcpy(abc->xyz, "abc");
sprintf(def->pqr, "%04d", 5);
strcpy(def->xyz, "def");
sprintf(ghi->pqr, "%04d", 6);
strcpy(ghi->xyz, "ghi");


引数つきマクロでこんな風に書けます。

#define SCPY(XXX, YYY, ZZZ) \
sprintf(...続きを読む

Qダイアログを継承したダイアログの作成について

お世話になります。
今回お聞きしたいことは、
オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか?
ということです。
何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。
そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。
継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。
ご回答を宜しくお願い致します。

開発環境は
Windows CE 6.0
Visual Studio 2005
です。

お世話になります。
今回お聞きしたいことは、
オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか?
ということです。
何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。
そのため、いちいち4つの...続きを読む

Aベストアンサー

私、CEの経験がないので厳密なところはわからないのですが、
一般的なMFCであれば、可能です。
ただし、条件により困難さが変わります

1)4つのダイアログが全て同じコントロールのみからなる場合
  コントロールは同じだが、ラベルのキャプションが違うとか
  リストボックスのデータが違うとかいう場合です。

  非常に単純です。普通の派生と全く同じ感じです
  OnInitDialog等適当な関数をオーバーライドするだけです。

2)共通のコントロール以外に独自のコントロールも持つ場合
  多少困難です
  いくつかアプローチが考えられます。
  a) ダイアログ・テンプレートを個別に持つ方法
    リソース内のダイアログ・テンプレートは(共通のコントロールも含め)
    コピー&ペーストなどで独自に作成します(4つ作ります)
それぞれを制御するクラスですが、
    ウィザードのサポートを受けられない
    (ウィザードではCDialog派生にされてしまう)
    ので、既存のCDialog派生クラスを参照して
    自力で希望のCDialog派生からさらに派生させるようにします

    リソースIDとクラスの結びつけ方法などは既存のクラスを
    参考にしてください

  b)リソースも完全に共通化する
    ちょっと難しいかもしれません。
    OnInitDialog等で自力でコントロールをCreateします。
    レイアウトが視覚的にできないので非常に困難ですが、
    隣接するコントロールの位置情報をもとに計算するなどしてください。

    ダイアログの大きさに余裕があり、
    追加するコントロールも小さなもの
    (1行のみのエディット等)であれば、
    最初から場所をstaticコントロールで場所を確保しておき
    非表示にしておいて、
    派生クラスで、そのstaticの位置を取得するとかなり楽ができます。

    派生クラスで、本格的にレイアウトが変わってしまう場合は、
    レイアウトを頭に入れながら、Createし、試行錯誤で
    完成させることになるでしょう。


以上の方法がCEでも通じるのかわかりませんが、
参考になれば幸いです。    

   

私、CEの経験がないので厳密なところはわからないのですが、
一般的なMFCであれば、可能です。
ただし、条件により困難さが変わります

1)4つのダイアログが全て同じコントロールのみからなる場合
  コントロールは同じだが、ラベルのキャプションが違うとか
  リストボックスのデータが違うとかいう場合です。

  非常に単純です。普通の派生と全く同じ感じです
  OnInitDialog等適当な関数をオーバーライドするだけです。

2)共通のコントロール以外に独自のコントロールも持つ場合
 ...続きを読む

QExcelの関数で引数を数える方法とは?

大学の情報の授業で、次のような課題が出題されました。

「Excelの関数で引数を数える方法について述べなさい」

意味がよくわからないので、誰かわかりやすく教えてください。

Aベストアンサー

Excelの関数で引数とは関数目に続いて()の中に入力されるもので、それぞれはカンマ(,)で区切られています。
例えばCOUNTIF関数はCOUNTIF(範囲,条件)のように使われますね。

A1セルからA10セルの間に10以上の数がいくつあるかを求めるのでしたらCOUNTIF(A1:A10,">=10")のような関数になり、引数の数は2、すなわちカンマの数に1をプラスした数になります。

引数を数える方法としては例えばこの関数をB1セルに文字列の形で入力するとして、次の式を使うことで求めることができるでしょう。

=LEN(ASC(B1)-LEN(SUBSTITUTE(ASC(B1),",",""))+1

Q子ダイアログのデータを親ダイアログで取得するには

VC6.0にてMFCでダイアログベースアプリケーションを作成しています。

親ダイアログ(TestDlg.cpp)のメニューを選択すると、子ダイアログ(SetDlg.cpp)が開き、テキストボックスに文字を入力し、ボタン押下によりテキストボックスの入力数字を確定(グローバル変数(igStatu)に代入)しています。
子ウインドウで入力確定したデータを、親ダイアログにて使用したいのですが、データが受け渡されずに、親ダイアログ側にデータが入りません。
どのようにしたら、子ダイアログで設定したデータを親ダイアログで取得することができるのでしょうか?

C++、MFCともに全然わかっていませんがお願いします。

グローバル変数は、TestDlg.cpp、SetDlg.cppがインクルードしているTest.h内にstatic宣言しています。
static宣言しないとリンクエラー2005になってしまいます。

Aベストアンサー

Test.h内で
extern int igStatu;

TestDlg.cpp内で
int igStatu;

とすればいいのでは?
externについて調べてみてください。

参考URL:http://homepage3.nifty.com/mmgames/c_guide/20-02.html

Q引数が無効とは

ドムで引数が無効ですというエラーなのですがどんなことが考えられますか。

Aベストアンサー

実際のコード見ないと一概に言えない。

Qコマンドとコマンドラインとコマンドラインオプションの違いを教えてください。

ただ今Cの関数を勉強しているのですが、勉強用HPに

************************

int main(int argc, char *argv[ ])

戻り値:int型、引数:argc, argv

後者は、コマンドライン オプションを受け付ける。 argc はオプションの数、argv はオプションの内容となる。

************************

とあります。

そこで質問なのですが、コマンドラインオプションとは何ですか?
また、

・コマンド
・コマンドライン
・コマンドラインオプション

の違い、それぞれの意味も教えてください。

マックのコマンド+s、コマンド+vみたいなものですか?
それともunixのcdや./のようなものでしょうか。

わからない単語が出てくると、
そこで頭が混乱してしまい先に進めない性質なので困っています。

どうぞご教授よろしくお願いします。

Aベストアンサー

★回答
・『コマンド』とは
 プログラム名の事です。
 つまり unix でいうと cd、cp、ls などです。
・『コマンドライン』とは
 プログラム名 引数 … 引数、オプションの1行の事です。
 または、コマンドを打ち込む入力待ちの状態です。
・『コマンドラインオプション』とは
 cp コマンドでいう -f、-i、-p、-r などの事です。
 cp コマンドでのファイル名は引数と呼びます。
 一般にオプションは - 文字から始まります。
 あと Windows の OS では / 文字から始まるスイッチオプションという呼び方がありますが、
 - 文字から始まるオプションとほぼ同じ役割です。また、- 文字、/ 文字から始まるものを
 合わせてオプションと呼ぶこともあります。

その他:
・main() 関数の引数にある『argc』は引数の個数、『argv』は引数の内容です。
 参考にした HP ではオプションの数、オプションの内容と呼んでいますが、引数もオプションも
 含まれます。引数とオプションはプログラムで区別するため、そのために - 文字や / 文字から
 始まる文字列をオプション(スイッチ)などとして区別しています。もし、- 文字や / 文字から
 始まらない文字列ならば、それが引数とプログラムで解釈するように C ソースを記述します。
・具体的にはコマンドラインで『cp -i -r file1.c file2.c』と入力するとプログラムでは、
 argc = 5
 argv[ 0 ] = "cp" ←プログラム名
 argv[ 1 ] = "-i"
 argv[ 2 ] = "-r"
 argv[ 3 ] = "file1.c"
 argv[ 4 ] = "file2.c"
 argv[ 5 ] = NULL ←必ずセットされる
 となります。
・argc はオプションと引数の合計数です。また、プログラム名もカウントされます。
 その他、argv[0] にプログラム名が入るか、空文字列が入るかは処理系依存です。
 あと argv[ argc ] の位置には必ず NULL ポインタがセットされることが保障されています。
・以上。参考に!

★回答
・『コマンド』とは
 プログラム名の事です。
 つまり unix でいうと cd、cp、ls などです。
・『コマンドライン』とは
 プログラム名 引数 … 引数、オプションの1行の事です。
 または、コマンドを打ち込む入力待ちの状態です。
・『コマンドラインオプション』とは
 cp コマンドでいう -f、-i、-p、-r などの事です。
 cp コマンドでのファイル名は引数と呼びます。
 一般にオプションは - 文字から始まります。
 あと Windows の OS では / 文字から始まるスイッチオプションという...続きを読む


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

人気Q&Aランキング

おすすめ情報