• ベストアンサー

空白を含む名前のファイル等を

受け取るプログラムで ”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; } です 対処方法を教えてください

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

コマンドライン文字列を自力で解析したらよいのでは? ファイル名がフルパスで渡されるのなら、各ファイル名の始まりは"C:"や"D:"のようにドライブ名になります。 #ネットワークファイルの場合は"\\"で始まってるかもしれない。(自信なし)

nubou
質問者

お礼

そうですね 最後の手段にとっておきます 参考に次のアプリを考えたのですが空白が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; } ありがとうございました

nubou
質問者

補足

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

その他の回答 (1)

回答No.1

> いろいろ調べてみるとまずい場合がまだあるということがわかりました > Windows95のc:\My documをドラッグ実行した場合です なにがどうまずいか説明してください。

nubou
質問者

補足

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

関連するQ&A

  • VS2010 C++ エラーについて

    Visual Studio2010のC++を使用しているのですが、DLLにメッセージボックスを使用したいと思っています。 .cppに #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance , LPSTR lpCmdLine, int cmdShow) { MessageBox(NULL,"○○○","△△△",MB_OK); return 0; } 上記のようなソースコードを使って見ると、○○○と△△△の部分でエラーを吐きます。 どのようにすれば改善されるか教えてください。

  • _tcscat がうまくいきません(VC++2008)

    以下のように入力し、ビルドすると 「error C2664: 'wcscat' : 1 番目の引数を 'LPCTSTR' から 'wchar_t *' に変換できません。」となり、うまくいきません。 ダイアログに「テストです。」と表示させたいです。一体どうしたらよいのでしょうか?ご教授ください~。 環境は、WindowsXP SP2 & Visual C++ 2008 Express Edition です。 なお、文字セットは「Unicode 文字セットを使用する」に設定してあります。 //----------------------------------------------------------- #include <Windows.h> #include <tchar.h> INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE,LPSTR,INT){ LPCTSTR str1 = _T("テスト"); LPCTSTR str2 = _T("です。"); _tcscat( str1, str2 ); MessageBox(NULL,str1,_T("Dialog"),MB_OK); return 0; }

  • C言語で黒い画面が出る

    gcc使ってC言語を勉強していますが、スタートmainをwindowsにしても黒い画面が出てきます。これを消すことはできませんか。やりたいことは単にメッセージボックスを表示して簡単なファイル入出力するだけです。ソースコードは以下 #include <windows.h> #include <tchar.h> int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MessageBox( NULL, _T("Hello, Windows!"), _T("sample"), MB_OK); return 0; }

  • 未解決の外部シンボル

    C言語は少しやっていたことがあり このたび、Winapiをしてみようと はじめました。 参考に見つけてきたプログラム #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { MessageBox( NULL, _T("Hello World"), _T("メッセージ"), MB_OK ); return 0; } をコンパイルしようとしたところ error LNK2019:未解決のシンボル __imp__MessageBoxA@16が関数_WinMain@16で 参照されました。 fatal errorLNK1120:外部1が未解決です。 と出てきます。 どうすればいいのでしょうか・・・ 困っています誰か助けてください Windows XP SP3 Visual Studio C++ 2008 Express Edition

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • C++BuilderでHelloWorld

     『プログラミングWindows』に載っている以下のコードをC++Builder6で実行するにはどうすればいいですか? #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0); return 0; }

  • main関数の事についてお聞きします。

    Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

  • VS2019でWinMainエラー発生

    以下メッセージを表示するだけのプログラムですが、以前はビルドできたのですが、VS2019になってからWinMainで「整合性のないインスタンス・・・」とエラーが出ます。なんででしょうか。 お願いします。 またVCをVBSみたいに黒い画面が出ずに引数を使用したいですが、その他アドバイスもお願いします。 #include <windows.h> int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox( NULL, TEXT("Hello, world!"), TEXT("Hello"), MB_OK | MB_ICONINFORMATION ); return 0; }

  • lpCmdLineについて

    #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION); return 0; } とやったのですが、lpCmdLineのパスが表示されません。なぜでしょうか?

  • コンパイルできません

    #include <windows.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ MessageBox(NULL, "Kitty on your lap","メッセージです", MB_OK); return 0; } の様なプログラムを組んだところ Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) の様にエラーになってしまいました。 どんな理由でエラーになっているのか調べたのですがよくわかりません。 一番初めのwin32APIを使ったプログラムで上手くコンパイルできないと 勉強が進まないので、わかる方教えてください。