• ベストアンサー

GetOpenFileName()について

Visual C++(Win32API)でアプリケーションを開発しているのですが,GetOpenFileNameで複数のファイル名を取得できるもののファイルごとの分割が出来ません。ちなみに,複数のファイルを選択できるようにはしてあります。また,環境の関係上文字列の型はLPTSTRを使わずLPWSTRを利用しています。環境は以下の通りです。 OS:Windows 7 SP1 Visual Studio:Visual Studio 2010 Professional 回答よろしくお願いします。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

処理の仕方自体はWCHARでもcharでも変わらないと思いますけど……。 http://www.crimson-systems.com/tips/t020a.htm とか。 charをWCHARへ、char *をWCHAR *への読み替えでOKなんじゃないですかね。 いまいちな例ですが……  OPENFILENAME ofn;  WCHAR fileName[MAX_PATH];  fileName[0] = '\0';  ZeroMemory(&ofn, sizeof(ofn));  ofn.lStructSize = sizeof(ofn);  ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_HIDEREADONLY;  ofn.lpstrFile = fileName;  ofn.nMaxFile = sizeof(fileName);  ofn.lpstrFilter = L"テキストファイル\0*.txt\0全てのファイル(*.*)\0*.*\0";  ofn.lpstrDefExt = L"txt";  ofn.nFilterIndex = 1;  if(GetOpenFileName(&ofn)) {   WCHAR TargetFile[3][MAX_PATH];   WCHAR TargetPath[MAX_PATH];   int iCnt = 0, nPos;   ZeroMemory(TargetFile, sizeof(TargetFile));   nPos = lstrlen(fileName) + 1;   if(fileName[nPos]) {    // 複数ファイルが選択された    lstrcpy(TargetPath, fileName);    if(fileName[lstrlen(fileName) - 1] != L'\\') lstrcat(TargetPath, L"\\");    do {     // パスをコピー     lstrcpy(TargetFile[iCnt], TargetPath);     lstrcat(TargetFile[iCnt], &fileName[nPos]);     iCnt++;     nPos += ( lstrlen(&fileName[nPos]) + 1);    } while(fileName[nPos]);   } else {    // 1つだけ選択された    lstrcpy(TargetFile[0], fileName);    iCnt = 1;   }   for(;iCnt > 0;iCnt--) {    MessageBox(hWnd, TargetFile[(iCnt - 1)], L"選択ファイル", MB_OK);   }  } 4ファイル以上選択すると吹っ飛ぶものになっていますが…まぁ、そこら辺はよろしく処理して下さい。 # あと…ローカル変数のサイズが……。

noname_989
質問者

お礼

回答頂きまして有難うございました!! 回答通りにしてみると無事ちゃんとした動作をすることができました!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • .NetでのDirectDrawの使用について

    現在会社のプロジェクトでC++でDirectDrawを使った業務用アプリケーションを開発しようとしているのですが,普段DirectDrawを用いたアプリケーションはwindows APIを使って開発を行なうことが多いと思うのですが,visual studio 2005 +.Netを用いてdirectdrawを使ったアプリケーションを作成することは可能なのでしょうか. お答えいただけると幸いです. 開発環境 visual studio 2005 .NET Framework 2.0 DirectX 7.0

  • Visual Studio 6.0 Professional → Visual Studio 2005 Professional

    質問1 現システムで下記開発環境を用いて、開発したシステムがあります 本システムをVisual Studio 2005 Professional のみで再開発することは可能でしょうか? 現システム  1.Visual Studio 6.0 Professional   Visual Basic 6.0 Visual C++ 6.0  2.Borland C++ Builder 6 Professional 質問2  Visual Studio 6.0 Professional(Visual Basic 6.0 Visual C++ 6.0)で開発したプログラムを Visual Studio 2005 Professionalでコンパイルすることは可能なのでしょうか?

  • VB6の後継って何ですか?

    Visual Studio 2010 Professional のVB(?)を使ってみましたが、VB6と結構違っていました。 VB6に慣れた人が今後使える開発環境が他にあれば教えてください。 Visual Studio 2010 Professional は使用期限が30日となっていますが、 VBっぽい開発環境で機能は少なくてもよいのですが、無償でずっと使えるものが あれば教えてください。 よろしくお願いします。

  • ◆ GetOpenFilename()で複数ファイル選択ができない、I

    ◆ GetOpenFilename()で複数ファイル選択ができない、IsArray()でNG。。。   複数選択のやり方をOKWaveで見つけ便利に活用させて頂いていたのですが、  今年になって、機能しなくなり困っています。手が出ない状況です。  ご教示、よろしくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 概要:Debugでみると、IsArray()の結果がfalse(GetOpenFilename不成功)  使用環境:  Microsoft EXCEL 2002 (10.6856.6853)SP3  Microsoft Visual Basic 6.0  Microsoft Windows XP Professional version 2002 Service Pack 3 不具合の発生箇所: 取込元ファイル = Application.GetOpenFilename(FileFilter:="Excelブック(*.xls),E*.xls", _ Title:="取込元の4ファイルを選択。Ctrlキーを押しながら複数選択。", MultiSelect:=True) If IsArray(取込元ファイル) Then ' 読む込み成功の確認、IsArray関数 <問題のマクロ> Sub メイン() ' ------------------------------------------------------------------- ' -  取込元のファイルを選択してオープン  ' ------------------------------------------------------------------- Dim 取込元ファイル, Work1, Work3 As Variant Dim i As Integer 取込元ファイル = Application.GetOpenFilename(FileFilter:="Excelブック(*.xls),E*.xls", _ Title:="取込元の4ファイルを選択。Ctrlキーを押しながら複数選択。", MultiSelect:=True) If IsArray(取込元ファイル) Then ' 読む込み成功の確認、IsArray関数 For i = 1 To UBound(取込元ファイル) '配列の上限UBound(データの件数 4件) Workbooks.Open 取込元ファイル(i)   'ファイルオープン Work1 = Dir(取込元ファイル(i)) WORK3 = WORK3 & Work1 & vbCrLf 'MSG表示用(取込んだファイル名一覧)   MsgBox "選択したファイルは " & vbCrLf & WORK3 & " ", vbInformation Next i Else MsgBox "取込元ファイルのオープンを" & vbCrLf & "中止しました", vbExclamation End If End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • Vs.NET 2003 どれをかえばいいのか?

    Visual Studio .NET 2003 の購入を検討しております。 Enterprise artchtect、Developer、professionalの 3つのバージョンがありますが、 どれをかえばよいのか判りません。 Windows2003サーバー、SQLSERVER2000、IIS6.0の環境でWebアプリケーションの開発を行いたいのですが、 それに見合ったバージョンはどれが良いのか教えてください。 よろしくお願いします。

  • 【Visual Studio】購入するなら2005?2008?

    22歳男性です。 「Visual Studio」の購入を考えており、2点ほど質問があります。 [1]会社では「Visual Studio 2005」で開発を行っているので購入するVisual Studioも「Visual Studio 2005」を購入するべきなのでしょうか?それとも最新の「Visual Studio 2008」を購入すべきなのでしょうか? (私としては会社で行っていることを自宅でも再現できるような環境をつくりたいと考えております。) [2]スタンダード版の購入を考えていますが、やはりプロフェッショナル版にするべきでしょうか?

  • 64ビット開発環境構築について

    64bitアプリケーションの開発環境構築で悩んでます。 現在の環境は、Microsoft Visual Studio 6.0、 Visual C++ 6.0です。 Milrosoft Pratform SDK SP1もインストールしました。 で、どのようにすると、64bitアプリケーションを作成できるのでしょうか? Visual Studio 2003.NETや2005の手法は見つけるのですが、Studio 6.0 また、Visual C++ 6.0での方法が見つかりません。 どなたか、やられたことのある方、もしくは参考のサイトをご存知の方は教えてください。 よろしくお願いします。

  • 自宅でlinux環境を作ってC言語を書けますか?

    表題の環境でコーディングをしたいです。 【質問1】 参考になるサイトなどはありますでしょうか? 【質問2】 linux環境での開発を、windows環境で開発をすることは可能なのでしょうか? 仮にvisual studio が入っているwindows環境があったとして、 makeファイルをvisual studio 用に変換&インポートしたり、 逆にvisual studioのプロジェクトファイル?をmakeファイルに変換したりすることをしたいです。 参考になるサイトなどはありますでしょうか? .

  • fgetws関数で読み込んだUNICODE文字列の文字化け

    お世話になります。 UNICODE文字列について上手くいかない部分があったので質問します。 (1)ANSI文字コードのテキストファイルをfgetws関数で読み込む (2)読み込んだ文字列をID3DXFont::DrawTextWメソッドで描画 以上のことを行うと、1バイト文字(半角文字)はきちんと表示されるのに対し、2バイト文字は化けてしまいます。 きちんと表示されるようにするにはどうすれば良いでしょうか? 開発環境:Visual Studio 2005 C++ 開発言語:C/C++(Win32API)+DirectX9.0b ご存知の方がいましたら、よろしくお願いします。

  • Windows Vista上で動作するアプリケーションの開発を行いたいと考えています。

    Windows Vista上で動作するアプリケーションの開発を行いたいと考えています。 今までの経験を生かし、VC++で開発しようと思ってますが、VC++6.0で開発したものは動作するのでしょうか? 一応無理っぽいなと思ってますので、Visual Studio 2008 Standard Editionを購入する予定ですがProfessional Edition じゃなくても大丈夫でしょうか?