アプリ版:「スタンプのみでお礼する」機能のリリースについて

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)でドロップしたファイルのパスは表示できています。

A 回答 (4件)

>>ちなみになぜ ” が入ってしまうのでしょうか?もしわかるようでしたら教えてください。



多分ですが、ファイル名(パス名含む)全体の中に半角スペースがあるのでは無いでしょうか?

その昔、実行ファイルに渡されるパラメータの区切りとして半角スペースを使用していました。
例えば、DOSコマンドのCOPY等で「copy a.txt b.txt」を実行すると、[a.txt]を[b.txt]にコピーする命令となります。
しかし、Windows95時代に入りファイル名に半角スペースが使用できるようになりました。
これを受けて、半角スペースを単純にパラメータの区切りとしてみなす事が出来なくなりました。
よって、半角スペースを含むファイル名の場合は前後に"を付加するようになっています。
「copy "a al.txt" b.txt」で「a al.txt」を一個のファイル名として扱えることが可能なようになっている。(実証済み)

ファイルをドロップした場合では、ファイル名に半角スペースが含まれている事をみなして"を付加していると思われます。

以上、参考までに。。。
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございます。

非常に興味深い話でした。

お礼日時:2009/09/09 19:30

AfxMessageBox(FileName)で何が表示されますでしょうか?


「●●.txt」だけだった場合、相対アクセスになっている可能性ありです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
自己解決できました。

ファイル名が
”~~~デスクトップ\input.txt”
となっていました。(デスクトップからドラッグした場合)

Cドライブ等からドロップした場合は、ファイル名が
C:\input.txt

となりうまく動きました。
char *p の最初の文字に ” が含まれている場合、最初と最後の 
” を取り除く処理を加えることでうまくいくようになりました。

ご協力ありがとうございました。

ちなみになぜ ” が入ってしまうのでしょうか?もしわかるようでしたら教えてください。

お礼日時:2009/09/09 12:32

>例えば、実行ファイルのアイコンに●●.txtをドロップした場合、


>”●●.txtが存在しません”というエラーが出てしまいます。 

アクセス権とかでしょうか…。
実ファイルをドラッグ&ドロップの筈ですから、存在しないはずはないでしょうし。
あるいは他のアプリが排他で開いている…とか。

パス名などに半角スペースが入っている…かとも思いますが、たぶんちゃんと開けるでしょうな。
ネットワークの共有フォルダから…の場合でも、そうそう接続は切れないでしょうし。

ちょっと解らないです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
いろいろと試してみようと思います。

お礼日時:2009/09/07 20:22

>ファイルを開いたときにエラーが発生してしまいうまくいきません。



どのようなエラーが出ますか?
また、どのように「うまくいきません」か?

# 「気分が悪い」と言っただけで、病名をぴたりと言い当てる医者は居ません。

>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が存在しません”というエラーが出てしまいます。 

申し訳ありませんが、よろしくお願いいたします。

補足日時:2009/09/06 18:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!