- ベストアンサー
GetOpenFileName()について
Visual C++(Win32API)でアプリケーションを開発しているのですが,GetOpenFileNameで複数のファイル名を取得できるもののファイルごとの分割が出来ません。ちなみに,複数のファイルを選択できるようにはしてあります。また,環境の関係上文字列の型はLPTSTRを使わずLPWSTRを利用しています。環境は以下の通りです。 OS:Windows 7 SP1 Visual Studio:Visual Studio 2010 Professional 回答よろしくお願いします。
- みんなの回答 (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ファイル以上選択すると吹っ飛ぶものになっていますが…まぁ、そこら辺はよろしく処理して下さい。 # あと…ローカル変数のサイズが……。
お礼
回答頂きまして有難うございました!! 回答通りにしてみると無事ちゃんとした動作をすることができました!!