- ベストアンサー
std::ifstreamについての質問
- std::ifstreamを使用してファイルをバイナリモードで展開しようとすると、フルパスを指定すると展開に失敗します。
- ファイルが存在しているかどうかはウィンドウにドロップされたファイルを基にして判断できます。
- 解決方法をご教示いただける方、よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 std::ifstreamにstd::ios::binaryを指定していないか、DragQueryFile()APIに渡す受け取りバッファのサイズが1文字分足りないかのどちらかでは。 パスの文字数+1でバッファを割り当てて、受け取る際もDragQueryFile()APIに文字数+1を指定しないと最後の一文字が欠けてしまいます。 #include<windows.h> #include<string> #include<fstream> LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: return 0; case WM_CLOSE: ::DestroyWindow(hWnd); return 0; case WM_DESTROY: ::PostQuitMessage(0); return 0; case WM_DROPFILES: { HDROP hDrop = reinterpret_cast<HDROP>(wParam); //ファイルの数を取る const UINT uiCount = ::DragQueryFile(hDrop, -1, NULL, 0); for(UINT ui = 0; ui < uiCount; ++ui) { //ファイルパスの文字数を取って+1する const UINT uiStrLen = ::DragQueryFile(hDrop, ui, NULL, 0) + 1; //受け取る為にバッファを割り当てる LPTSTR pszPath = new TCHAR[uiStrLen]; //バッファに文字列を受け取る ::DragQueryFile(hDrop, ui, pszPath, uiStrLen); //バイナリモードで開く std::ifstream ifs(pszPath, std::ios::in | std::ios::binary); //ビットマップであるかどうかを判定してみる BITMAPFILEHEADER bmif; ifs.read(reinterpret_cast<char*>(&bmif), sizeof(bmif)); if(bmif.bfType == ('B' | ('M' << 8))) ::MessageBox(hWnd, NULL, TEXT("ビットマップです"), IDOK); //バッファの消去 delete pszPath; } ::DragFinish(hDrop); } return 0; } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); }