プロが教える店舗&オフィスのセキュリティ対策術

std::ifstreamを用いてファイルを展開し、バイナリを読み出そうとしているのですが、

std::ifstream ifs( /*ファイル名*/ );

ファイル名を指名するときにフルパスを指定するとなぜか展開に失敗します。
(今回エラーが出ているのはWinAPIのドロップされたファイルからフルパスを取得して展開しようとしています)

FILE* fp = fopen( /*フルパス*/. "rb" );
としてファイルを展開するとfpには有効なポインターが入っているのでファイルがないということはなさそうです。そもそもウィンドウにドロップしているので存在しないということはないと思います。

解決方法がわかるかたよろしくおねがいします。

/*
WindowsXP Professional32bit
VisualStudio2005 AcademicEdition
*/

A 回答 (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);
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!