- 締切済み
アイコンにドラッグアンドドロップ
VisualStudio 2005 で c++でダイアログベースのアプリケーションを作成しています。 ファイルをアイコンにドラッグアンドドロップして開くということをやりたいのですが、ファイルを開いたときにエラーが発生してしまいうまくいきません。対処方法を教えてください。 ソースファイル ::OnInitDialog(){ : : : : // TODO: 初期化をここに追加します。 DragAcceptFiles(); char *p = AfxGetApp()->m_lpCmdLine; CFile fin; if(p[0]!=NULL){ AfxMessageBox(p); fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); } AfxMessageBox(p)でドロップしたファイルのパスは表示できています。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
>>ちなみになぜ ” が入ってしまうのでしょうか?もしわかるようでしたら教えてください。 多分ですが、ファイル名(パス名含む)全体の中に半角スペースがあるのでは無いでしょうか? その昔、実行ファイルに渡されるパラメータの区切りとして半角スペースを使用していました。 例えば、DOSコマンドのCOPY等で「copy a.txt b.txt」を実行すると、[a.txt]を[b.txt]にコピーする命令となります。 しかし、Windows95時代に入りファイル名に半角スペースが使用できるようになりました。 これを受けて、半角スペースを単純にパラメータの区切りとしてみなす事が出来なくなりました。 よって、半角スペースを含むファイル名の場合は前後に"を付加するようになっています。 「copy "a al.txt" b.txt」で「a al.txt」を一個のファイル名として扱えることが可能なようになっている。(実証済み) ファイルをドロップした場合では、ファイル名に半角スペースが含まれている事をみなして"を付加していると思われます。 以上、参考までに。。。
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
AfxMessageBox(FileName)で何が表示されますでしょうか? 「●●.txt」だけだった場合、相対アクセスになっている可能性ありです。
お礼
ありがとうございます。 自己解決できました。 ファイル名が ”~~~デスクトップ\input.txt” となっていました。(デスクトップからドラッグした場合) Cドライブ等からドロップした場合は、ファイル名が C:\input.txt となりうまく動きました。 char *p の最初の文字に ” が含まれている場合、最初と最後の ” を取り除く処理を加えることでうまくいくようになりました。 ご協力ありがとうございました。 ちなみになぜ ” が入ってしまうのでしょうか?もしわかるようでしたら教えてください。
- Wr5
- ベストアンサー率53% (2173/4061)
>例えば、実行ファイルのアイコンに●●.txtをドロップした場合、 >”●●.txtが存在しません”というエラーが出てしまいます。 アクセス権とかでしょうか…。 実ファイルをドラッグ&ドロップの筈ですから、存在しないはずはないでしょうし。 あるいは他のアプリが排他で開いている…とか。 パス名などに半角スペースが入っている…かとも思いますが、たぶんちゃんと開けるでしょうな。 ネットワークの共有フォルダから…の場合でも、そうそう接続は切れないでしょうし。 ちょっと解らないです。
お礼
回答ありがとうございます。 いろいろと試してみようと思います。
- Wr5
- ベストアンサー率53% (2173/4061)
>ファイルを開いたときにエラーが発生してしまいうまくいきません。 どのようなエラーが出ますか? また、どのように「うまくいきません」か? # 「気分が悪い」と言っただけで、病名をぴたりと言い当てる医者は居ません。 >AfxMessageBox(p); >fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); >AfxMessageBox(p)でドロップしたファイルのパスは表示できています。 FileNameとは何者ですか? # タイトルの「アイコンに」というのも、少々伝わりにくいと思いますが。 # 「実行ファイルのアイコンに」くらいにした方が伝わりやすいかと。 ## 「自作゜ログラム上に表示しているアイコンに」という場合もありますし。
補足
回答ありがとうございます。 >fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); ではなく、 >fin.Open(p, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); の間違いです。 申し訳ありません。 また、エラーの内容ですが、 例えば、実行ファイルのアイコンに●●.txtをドロップした場合、 ”●●.txtが存在しません”というエラーが出てしまいます。 申し訳ありませんが、よろしくお願いいたします。
お礼
わかりやすい回答ありがとうございます。 非常に興味深い話でした。