2017-10-08 14 views
-3

私は、次のコードを持っている:私はReadFile関数を呼び出すKernelBase.dllたびにアクセス違反(0xC0000005)取得C++のReadFileのクラッシュ問題

HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 
    OPEN_EXISTING, 0, NULL); 
std::cout << "File Handle: " << hFile << std::endl; 

DWORD fileSize = GetFileSize(hFile, NULL); 
PVOID fileBuffer = VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
if (!fileBuffer) std::cout << "Couldn't allocate memory " << GetLastError() << std::endl; 
// Read the DLL 
if (!ReadFile(hFile, fileBuffer, fileSize, NULL, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl; 

を。 はまた、CreateFileのは、私はそれが通常のノーマルハンドルだかどうあまりにもわからないんだけど、

File Handle: 0000000000000040 

すべての時間を示しています。

Full Code, with error from debugger, VS2017

編集:私は、ファイルサイズを印刷する場合、それはReadFile関数のMSDNドキュメントから18

+0

このコードは正常に動作します。表示されていないコードにエラーがある場合は、完全な例を示すことができます。 –

+0

私は上記のメイン機能から何もせずに投稿したコードだけを実行しようとしましたが、それでもクラッシュします。 – NVMESSD

+0

質問の本文にテキストとして表示される完全なコードとエラーを投稿してください。 –

答えて

4

を示しています[オプションアウト、]

lpNumberOfBytesRead

ポインタ が、同期hFileパラメータ を使用するときに読み込まれるバイト数を受け取る変数に設定します。 ReadFileは、作業を行う前にこの値を0に設定するか、エラーチェックを 行います。誤った結果を避けるために、非同期の操作である場合は、このパラメータにNULLを使用してください。 このパラメータは、lpOverlappedパラメータがNULLでない場合にのみ をNULLにすることができます。 の詳細については、「備考」セクションを参照してください。

これを試してみてください:私は160メガバイトを読み込むかそこら提出するため

DWORD read; 
if (!ReadFile(hFile, fileBuffer, fileSize, &read, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl; 
+1

ええ、私はそれを見て、私のコメントを取り消しました。 nullのときにWindows 10に問題は発生しません。バイト読み込みがnullのときにOPがクラッシュする古いOS上にあるかもしれません...それは単なる推測です。 – selbie

+0

@selbie - はい、古いウィンドウバージョン* ReadFile *書き込み* lpNumberOfBytesRead * lpOverlapped *が0の場合。8.1から始まります(または7になるかもしれません、私は今チェックしません)。* ReadFile * check * lpNumberOfBytesRead *は0の値で、この場合は書き込みません。 – RbMm

関連する問題