質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

606閲覧

外部アプリケーションのエディットコントロールにCStringで引数を渡したい

Grayi

総合スコア26

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/06 13:14

編集2018/11/06 13:24

MFCのダイアログベースでアプリケーションを作っています。使用言語はC++。開発環境はVisual studio2010です。

作成しているアプリケーションは以下の二つです。
①:エディットコントロールに入力された文字列を解析するアプリ
②:①のアプリにCString文字列を渡すアプリ。

a,右クリックで文字列を選択&ポップアップメニューを開く
b,ポップアップメニューに表示された①の名前を左クリック
c,①が起動
d,①のエディットコントロールに、先程選択した文字列をセットする。

という一連の流れが出来るようにしたいのですが、①から②にCStringの文字列を渡す方法が分かりません。Cまでの処理は出来ています。
コードは以下のようになっております。

C++

1(①のコード) 2void CMsgCatch::OnBnClickedButtonAnalze() 3{ 4 CString strCommand; 5 m_edCommand.GetWindowText(strCommand); 6 //m_edCommandはエディットコントロールの変数 7 8  /*解析処理(中略)*/ 9} 10 11======================================== 12 13(②のコード) 14BOOL CTest::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 15{ 16 if( nID == IDS_STARTEXE ) 17 { 18 if( nCode == CN_COMMAND ) 19 { // メニューがクリックされた時の処理 20 ShellExcute(GetHwnd(),NULL,TEXT("①のexe絶対パス"),AAA,(“exeが置いてあるディレクトリのパス”,SW_SHOWNORMAL) 21   //①を起動し、文字列AAAを引数として渡す。文字列AAAはCStringで、右クリックで選択されたもの 22 } 23 else if( nCode == CN_UPDATE_COMMAND_UI ) 24 { 25 CCmdUI* pCmdUI = (CCmdUI*)pExtra 26 pCmdUI->Enable( TRUE ); 27 } 28 return TRUE; 29 } 30} 31 32 33void CTest::OnNMRClickListMessage(NMDR *pNMHDR, LRESULT :pResult) 34{ 35 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(PNHDR); 36 37 CMenu menu; 38 menu.CreatePopupMenu(); 39 menu.AppendMenu(MF_STRING|MF_ENABLED,IDS_STARTEXE ,"①の名前"); 40 41 ClientToScreen(&point); 42 menu.TrackPopupMenu( 43 TPM_LEFTALIGN | //クリック時のX座標をメニューの左辺にする 44 TPM_RIGHTBUTTON, //右クリックでメニュー選択可能とする 45 point.x,point.y, //メニューの表示位置 46 this //このメニューを所有するウィンドウ 47); 48 menu.DestroyMenu(); 49} 50

この文字列AAAを①のエディットコントロールに渡したいと考えています。
m_edCommand.SetWindowText(AAA);みたいな感じで出来るのでは、と考えているのですが、方法が分かりません。お力をお借りできれば幸いです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/11/06 13:28

aでの選択される文字列は、ブラウザなど任意ソフト上を想定していますか?それとも独自ソフトの特定のエディットコントロール上に限定していますか?
Grayi

2018/11/07 13:48

同じくMFC のダイアログベースで作成した、リストボックス上にある文字列に限定しています。②のアプリのリストボックスに、文字列AAAがある、という感じです。分かりづらくてすみません。
guest

回答2

0

ベストアンサー

以下のように書けば起動引数にアクセスできます。

cpp

1 if (__argc > 1) { 2 m_edCommand.SetWindowText(__targv[1]); 3 }

ただし、起動引数を使って文字列を渡す場合は、例えば半角スペースを入れると期待通りに動かないとかそういった事がおきえます。
(その辺は頑張れば回避できます)

投稿2018/11/07 02:13

編集2018/11/07 02:15
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Grayi

2018/11/07 14:09

takabosoftさん、今回も教えてくださってありがとうございます。おかげで下記のようにしたら出来ました! ```C++ //①のアプリのDlg.cpp BOOL CMsgCatch::OnInitDialog() { /*中略 */ //起動前の処理を行うところ if (__argc > 1) { m_edCommand.SetWindowText(GetCommandLine());    //①のアプリの解析ボタンのクリックイベントを発生させる処理    //IDS_BUTTON_ANALYZEは解析ボタンのID Cwd* pButton = GetDigItem(IDS_BUTTON_ANALYZE); pButton -> SendMessage(BM_CLICK, 0, 0); } return TRUE; } ``` 渡す文字列に半角スペースが入っていたので、__targv[1]では、仰っていた通り期待通りに動きませんでした。文字列の先頭のみ取り出されていたので、おそらくwhile文とかで回せば__targv[1]でもすべての文字列を取り出せそうだと思いましたが、GetCommandLine()の方がコードが短いと思ったので、そのようにしました。 実装したい機能を作成することが出来ました。ありがとうございます。
takabosoft

2018/11/08 00:57

GetCommandLine()だと自分のEXEパスとかも入っちゃいませんか?(それで差し支えが無ければ良いのですが)
Grayi

2018/11/19 11:29

返信が遅くなり申し訳ありません。 ご指摘の通り、考えてみればEXEパスが入ってもおかしくないのですが、何故か問題無く取得したい文字列のみを取り出すことが出来ました。 どうしてなのかちゃんと調べてみます。
guest

0

コマンドライン引数でAAAを渡しているのであれば、①のアプリケーションでコマンドライン引数からAAAを取得して、エディットコントロールにセットしてやります。
CCommandLineInfoクラスを使ってやれば、コマンドライン引数を取得することができます。

投稿2018/11/06 13:37

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Grayi

2018/11/07 14:14

回答してくださってありがとうございます。 CCommandLineInfoクラスを調べたのですが、上手く使うことができませんでした。ですが、CCommandLineInfoクラスを調べている時に、GetCommandLine()でコマンドライン引数を取得できることが分かりました。GetCommandLine()を使い、欲しい機能を作成することができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問