>【アイコン状態】
>の場所に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」みたいに「存在しないドライブ名」だったりします。
実行時引数を「ファイル名の取得」として利用する場合は「文字列がファイル名として正しいかどうか?」を事前にチェックしましょう。
お礼
chie65535様 丁寧なご解説ありがとうございます。 私の未熟なせいで大変失礼かつ身勝手なことをしてしまいました。 お詫びします。