重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

受け取るプログラムで
”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;
}

です
対処方法を教えてください

A 回答 (2件)

コマンドライン文字列を自力で解析したらよいのでは? ファイル名がフルパスで渡されるのなら、各ファイル名の始まりは"C:"や"D:"のようにドライブ名になります。



#ネットワークファイルの場合は"\\"で始まってるかもしれない。(自信なし)

この回答への補足

結局最後の手段に頼ることになってしまいました
しかしお礼で書いたように__argvは使用できません
GetCommandLineを使うしか今のところ情報がありません
しかしこれのフォーマットが新しい質問で書いたものかどうかわかりません
今は98SEと95ですがOSを更新したら動かなくなるプログラムは作りたくないのです
そこでもしお分かりならば新しい質問に回答していただければ幸いなのですが
よろしくお願いします

補足日時:2003/05/10 22:42
    • good
    • 0
この回答へのお礼

そうですね
最後の手段にとっておきます
参考に次のアプリを考えたのですが空白が2回続くと__argvを使うやり方は破綻しますね

#include <windows.h>
#include <string>
#include <list>
using namespace std;

WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
list<string>L;
list<string>::iteratorp,q;
stringstr="";
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);
}
elseq=p++;
}
for(p=L.begin();p!=L.end();str+='<'+*(p++)+">\n");
MessageBox(NULL,str.c_str(),"Command",MB_OK);
return 0;
}

ありがとうございました

お礼日時:2003/05/10 01:24

> いろいろ調べてみるとまずい場合がまだあるということがわかりました


> Windows95のc:\My documをドラッグ実行した場合です

なにがどうまずいか説明してください。

この回答への補足

素早い回答ありがとうございます

Windows95で
ディレクトリ"c:\My docum"を
質問のプログラムにドラッグ実行すると
メッセージボックスに
<c:\My docum>
と表示したいのに
<c:\My>
<docum>
と表示されてしまい一つのディレクトリが2つのディレクトリと見なされるのです
98だとMy documがMydocu~2に変換され事なきを得るのです
しかし98でもいつも事なきを得るかどうかはいろいろ試してみないとわかりません
古い95マシンも持っていて使いたいのでどうしてもなおしたいのです
よろしくお願いします

補足日時:2003/05/09 15:43
    • good
    • 0

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