ファイルを右クリックし、「送る」からアプリケーションを選択した場合、アプリケーションの起動時の引数にファイル名が与えられる。
コマンドラインアプリケーションの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 へのリンク
|