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

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

ただいまの
回答率

88.60%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 875

Grayi

score 22

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

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

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

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

(①のコード)
void CMsgCatch::OnBnClickedButtonAnalze()
{
   CString strCommand;
   m_edCommand.GetWindowText(strCommand);
   //m_edCommandはエディットコントロールの変数

  /*解析処理(中略)*/
}

========================================

(②のコード)
BOOL CTest::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{
  if( nID == IDS_STARTEXE )
  {
   if( nCode == CN_COMMAND )
    { // メニューがクリックされた時の処理
      ShellExcute(GetHwnd(),NULL,TEXT("①のexe絶対パス"),AAA,(“exeが置いてあるディレクトリのパス”,SW_SHOWNORMAL)
   //①を起動し、文字列AAAを引数として渡す。文字列AAAはCStringで、右クリックで選択されたもの
    }
   else if( nCode == CN_UPDATE_COMMAND_UI )
    {
     CCmdUI* pCmdUI = (CCmdUI*)pExtra
     pCmdUI->Enable( TRUE );
    }
    return TRUE;
   }
}


void CTest::OnNMRClickListMessage(NMDR *pNMHDR, LRESULT :pResult)
{
  LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(PNHDR);

  CMenu menu;
  menu.CreatePopupMenu();
  menu.AppendMenu(MF_STRING|MF_ENABLED,IDS_STARTEXE ,"①の名前");

  ClientToScreen(&point);
  menu.TrackPopupMenu(
  TPM_LEFTALIGN | //クリック時のX座標をメニューの左辺にする
  TPM_RIGHTBUTTON, //右クリックでメニュー選択可能とする
  point.x,point.y, //メニューの表示位置
  this //このメニューを所有するウィンドウ
);
  menu.DestroyMenu();
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2018/11/06 22:28

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

    キャンセル

  • Grayi

    2018/11/07 22:48

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/07 23: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()の方がコードが短いと思ったので、そのようにしました。
    実装したい機能を作成することが出来ました。ありがとうございます。

    キャンセル

  • 2018/11/08 09:57

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

    キャンセル

  • 2018/11/19 20:29

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/07 23:14

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

    キャンセル

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る