
std::ifstreamを用いてファイルを展開し、バイナリを読み出そうとしているのですが、
std::ifstream ifs( /*ファイル名*/ );
ファイル名を指名するときにフルパスを指定するとなぜか展開に失敗します。
(今回エラーが出ているのはWinAPIのドロップされたファイルからフルパスを取得して展開しようとしています)
FILE* fp = fopen( /*フルパス*/. "rb" );
としてファイルを展開するとfpには有効なポインターが入っているのでファイルがないということはなさそうです。そもそもウィンドウにドロップしているので存在しないということはないと思います。
解決方法がわかるかたよろしくおねがいします。
/*
WindowsXP Professional32bit
VisualStudio2005 AcademicEdition
*/
No.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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- その他(コンピューター・テクノロジー) <a href="file:///フォルダ名/ファイル名">リンクテキスト</a>について 1 2023/04/06 22:40
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- フリーソフト イーファンビューでwebpファイルが開けません 1 2022/07/12 07:07
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
エクセルVBAで一つ上の階層...
-
エディットボックスの数値をテ...
-
xcopyコマンドの進行状況を表示...
-
Excel 相対パス
-
コマンドプロンプトのコピー関...
-
ExcelのVBAで上書き保存を確...
-
【VBA】ExcelマクロでCSVファイ...
-
ファイル名の半角スペースについて
-
A列に記載されているフォルダ...
-
fopenでのパス指定
-
実行ファイルのパスを取得したい
-
実行中のASPファイル名(自ファ...
-
【VB.NET】App.configにファイ...
-
EXCEL(VBA)で指定フォルダ内の...
-
SaveAsの保存先について
-
エクセルのマクロで特定フォル...
-
TeraTerm マクロの getdir コマ...
-
Excel VBAでテキストファイルを...
-
SHGetPathFromIDList によるパ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
エクセルVBAで一つ上の階層...
-
xcopyコマンドの進行状況を表示...
-
Excel 相対パス
-
実行ファイルのパスを取得したい
-
コマンドプロンプトのコピー関...
-
【VB.NET】App.configにファイ...
-
エクセルのマクロで特定フォル...
-
VBA★PDFをPDFアプリで印刷し...
-
ExcelVBAの使い方 ¥の使い方...
-
fopenでのパス指定
-
ExcelのVBAで上書き保存を確...
-
EXCEL(VBA)で指定フォルダ内の...
-
C#でのProcess.Startと変数path
-
【VBA】ExcelマクロでCSVファイ...
-
VBAでパワーシェルを実行したい...
-
A列に記載されているフォルダ...
-
初心者powershellのPS1ファイル...
-
Eclipse
-
VBAとロングファイル名
おすすめ情報