The Tips for Developers > 「送る」を使用する

「送る」を使用する(最終更新日 2002/05/24)

「送られる」プログラムの作成
ファイルを右クリックし、「送る」からアプリケーションを選択した場合、アプリケーションの起動時の引数にファイル名が与えられる。
コマンドラインアプリケーションのC言語風に書けば、下記のようになる。
01: void main(int argc, char* argv[ ])
02: {
03:  if(argc < 2){
04:      printf("「送る」コマンドは使用していません。");
05:      return;
06:  }
07:  for(int i = 1; i < argc: i++)
08:      printf("「送られた」ファイル名 = %s\n", argv[1]);
09:  }
10: }
MFCの場合、main 関数の引数を取得するというわけにはいかないので、CWinAppクラスから派生したクラスの InitInstance 関数内で、CWinApp::m_lpCmdLine からコマンド引数を取得する。

以下は、「送る」で指定されたファイル名をリストボックスに表示するアプリケーションの例である。

まず、ClassWizard より、リストボックスのメンバ変数を登録する。ここでは、m_myList としている。
次に CDialog クラスより派生しているクラス(以下、CSendDlg クラス)に対して、CString 型のメンバ変数 m_myCmdLine を登録する。

CWinAppから派生したクラス(以下、CSendApp クラス)から、コマンドライン引数を CSendDlg クラスに連携するため、CSendDlg クラスにパブリックなメンバ関数を作成する。
01: BOOL CSendDlg::SetItems(char *Item)
02: {
03:    m_myCmdLine = Item;
04:    return TRUE;
05: }
この関数は、引数から与えられた char* 型データを CString 型の m_myCmdLine に格納している。

CSendApp クラスの InitInstance 関数で、当該関数を組み込む。このときの引数が m_lpCmdLine になる。
以下は CSendDlg::InitInstance 関数の抜粋で、4行目に上記の関数が組み込まれている。
01:     CSendDlg dlg;
02:     m_pMainWnd = &dlg;
03:
04:     dlg.SetItems(this->m_lpCmdLine);
05:
06:     int nResponse = dlg.DoModal();
最後に、CSendDlg クラスの OnInitDialog 関数で、CSendDlg::SetItems 関数により取得されたコマンドライン引数を展開し、リストボックスに格納する。
01:     // TODO: 特別な初期化を行う時はこの場所に追加してください。
02:     char* myCmdLine = (char*)malloc(strlen(m_myCmdLine) + 1);
03:     strcpy(myCmdLine, m_myCmdLine);
04:     char* token = strtok(myCmdLine, " \n");
05:
06:     while(token != NULL){
07:          m_myList.AddString(token);
08:          token = strtok(NULL, " \n");
09:     }
10:
11:     free(myCmdLine);
12:     return TRUE;


サンプルプログラム
Send.LZH へのリンク