• ベストアンサー

GetOpenFileName()について

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

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答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

専門家に質問してみよう