- ベストアンサー
空白を含む名前のファイル等を
受け取るプログラムで ”x y.txt”が一つのファイルと見なされるようにするため yoppiiさんに GetCommandLine() を使うのをやめて __argvや__argc すればいいという事を教えてもらいいったん解決したのですが いろいろ調べてみるとまずい場合がまだあるということがわかりました Windows95のc:\My documをドラッグ実行した場合です 試験用アプリは #include <windows.h> #include <string> using namespace std; WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { string str=""; for(int i=0;i<__argc;str=str+'<'+__argv[i++]+">\n"); MessageBox(NULL,str.c_str(),"Command",MB_OK); return 0; } です 対処方法を教えてください
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
コマンドライン文字列を自力で解析したらよいのでは? ファイル名がフルパスで渡されるのなら、各ファイル名の始まりは"C:"や"D:"のようにドライブ名になります。 #ネットワークファイルの場合は"\\"で始まってるかもしれない。(自信なし)
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> いろいろ調べてみるとまずい場合がまだあるということがわかりました > Windows95のc:\My documをドラッグ実行した場合です なにがどうまずいか説明してください。
補足
素早い回答ありがとうございます Windows95で ディレクトリ"c:\My docum"を 質問のプログラムにドラッグ実行すると メッセージボックスに <c:\My docum> と表示したいのに <c:\My> <docum> と表示されてしまい一つのディレクトリが2つのディレクトリと見なされるのです 98だとMy documがMydocu~2に変換され事なきを得るのです しかし98でもいつも事なきを得るかどうかはいろいろ試してみないとわかりません 古い95マシンも持っていて使いたいのでどうしてもなおしたいのです よろしくお願いします
お礼
そうですね 最後の手段にとっておきます 参考に次のアプリを考えたのですが空白が2回続くと__argvを使うやり方は破綻しますね #include <windows.h> #include <string> #include <list> using namespace std; WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { list<string> L; list<string>::iterator p,q; string str=""; for(int i=0;i<__argc;L.push_back(__argv[i++])); p=++(q=L.begin()); while(p!=L.end()) { if(p->find(':')==p->npos) { *q+=' '+*p;p=L.erase(p); } else q=p++; } for(p=L.begin();p!=L.end();str+='<'+*(p++)+">\n"); MessageBox(NULL,str.c_str(),"Command",MB_OK); return 0; } ありがとうございました
補足
結局最後の手段に頼ることになってしまいました しかしお礼で書いたように__argvは使用できません GetCommandLineを使うしか今のところ情報がありません しかしこれのフォーマットが新しい質問で書いたものかどうかわかりません 今は98SEと95ですがOSを更新したら動かなくなるプログラムは作りたくないのです そこでもしお分かりならば新しい質問に回答していただければ幸いなのですが よろしくお願いします