• ベストアンサー

DragDrop

VC++6.0のMFCを使っています。 DragAcceptFileなどを使ってデスクトップ上の実行ファイルを実行した段階でのDragDropはできました。 これをデスクトップ上の実行ファイルを実行しない段階で つまり(移動させたい)ファイルをその実行ファイルの 【アイコン状態】 の場所にDragDropしてくるとそのまま実行されるプログラムにしたいのですがデスクトップ上のアイコン状態の場所に移動させると実行するプログラムの作り方がわかりません。教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

>【アイコン状態】 >の場所にDragDropしてくるとそのまま実行されるプログラムにしたい アイコン状態のアプリケーションアイコンにファイルをドロップすると、エクスプローラーは「ドロップされたファイルのフルパスをコマンドライン引数として、そのアプリを起動」します。 デスクトップにメモ帳のショートカットアイコンを置いて、そのアイコンにC:\testにあるtest.txtをドロップすると、エクスプローラーは、コマンドプロンプトで notepad C:\test\test.txt[Enter] と打ち込んだのと同じ動作をします。 アプリは「実行時引数が付けられたまま、普通に起動」します。 で、普通、VC++でプログラムを作ると、何もしていなくても「実行時引数を参照できるアプリケーションが作られる」ので、特に何もする必要はありません。 単に「メインプログラムの最初で、実行時引数があるかどうか、確認するだけ」です。 「起動してない状態でアイコンにドロップ」した場合、ドラッグドロップの処理(DragAcceptFileや、ドロップイベントに対する処理は「エクスプローラーがやっている」のです。 エクスプローラーがDragAcceptFileを駆使して「ドラッグ中のファイルは何か」を取得し「アイコンになっているアプリを起動する際に、取得したファイル名を実行時引数として渡しているだけ」です。 そういう訳で、メインプログラムの最初で「__argcは幾つか?」を調べ、実行時引数があるなら(__argcが2以上だったら)「__targv[1]~__targv[__argc - 1]」の内容を「ドロップされたファイル名として処理する」って事になります。 アイコン状態からドロップして起動しなくても、コマンドプロンプトを開いて プログラム名 aaa bbb ccc[Enter] って打ってみれば、アイコン状態からドロップして起動したのと同じになりますので、テストする場合は、コマンドプロンプトを活用しましょう。 また、ショートカットアイコンのプロパティを見ると「リンク先」に「起動する実行ファイル」が書いてありますが、この「起動する実行ファイル」の後ろに半角スペースで区切って文字列を書くと、それも「実行時引数」になります。 なお、上記のように「ショートカットアイコンのプロパティを書き換えられた可能性」や「コマンドプロンプトから、実行時引数にテキトーな文字列を書かれて起動される可能性」があるので「実行時引数に書かれたのが必ずファイルとしてオープン出来る」とは限りません。 ショートカットアイコンのプロパティや、コマンドプロンプトで起動すれば、引数には好きな文字が何でも書けるので、引数の文字列が「::::::」のような「ファイル名として使えない文字列」だったり「T:\aaa\aaa」みたいに「存在しないドライブ名」だったりします。 実行時引数を「ファイル名の取得」として利用する場合は「文字列がファイル名として正しいかどうか?」を事前にチェックしましょう。

minaraiH
質問者

お礼

chie65535様 丁寧なご解説ありがとうございます。 私の未熟なせいで大変失礼かつ身勝手なことをしてしまいました。 お詫びします。

その他の回答 (4)

回答No.4

No.2がいろいろ間違っていたので訂正 for (int i = 0; i < __argc; ++i) {   AfxMessageBox(__targv[i]); } です。

minaraiH
質問者

補足

実行ファイルのフルパス名の表示 ドロップしたファイルのフルパス名の表示 そして実行ファイルが実行されました。

回答No.3

>このプログラムの実行ファイルのフルパス名っぽいのが出力されました。 アイコンにファイルをドロップしていますか?

回答No.2

CXXXApp::InitInstance内に if (int i = 0; i < __argc; ++i) {   AfxMessageBox(__argv[i]); } でどうなるか確認してみては?

minaraiH
質問者

補足

このプログラムの実行ファイルのフルパス名っぽいのが出力されました。

回答No.1

起動引数に入ってくるのでは? (__argvとかCXXAppクラスのm_lpCmdLineメンバでとれる)

minaraiH
質問者

補足

それはわかってるんですが、サンプルがないと使いこなせなくて・・ どっかいいサイトないでしょうか

関連するQ&A