Как я могу решить эту ошибку в моем Win32, читая код файла изображения - PullRequest
0 голосов
/ 09 июня 2018

Я не мог решить эту проблему.Я не знаю, почему я получаю это сообщение об ошибке.

Исключение, выданное в 0x7642DEB5 (KernelBase.dll) в Project2.exe: 0xC0000005: Место записи нарушения прав доступа 0x00000000.

Ошибка при ReadFile(file,lpBuffer, nNumberOfBytesToRead-1, NULL, NULL)

Вот мой код.Я пытаюсь получить доступ к файлу JPG, чтобы прочитать его заголовок.

#include<Windows.h>
#include<iostream>

int main()
{
    LPCTSTR path = "jpg.jpg";
    DWORD nNumberOfBytesToRead;

    HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (file == INVALID_HANDLE_VALUE)
    {
        std::cout << "The file couldnt be opened" << std::endl;
    }

    nNumberOfBytesToRead = GetFileSize(file, NULL);

    BYTE *lpBuffer = new BYTE[nNumberOfBytesToRead-1] ;

    if (ReadFile(file,lpBuffer, nNumberOfBytesToRead-1, NULL, NULL))
    {
        delete[] lpBuffer;
        CloseHandle(file);
        std::cout << "The file couldnt be read" << std::endl;
    }
    CloseHandle(file);
    delete[] lpBuffer;

    if (file != 0)
    {
        std::cout << "The file has been closed" << std::endl;
    }

    system("PAUSE");
    return 0;
}

Спасибо, я решил эту проблему.У меня есть другая проблема

lpBuffer = 0xcccccccc Ошибка чтения символов строки.>

введите описание изображения здесь

Здесьмой новый код.

#include<Windows.h>
#include<iostream>

int main()
{
LPCTSTR path = "jpg.jpg";
DWORD nNumberOfBytesToRead = 0;
DWORD nNumberOfBytesRead = 0;
HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (file == INVALID_HANDLE_VALUE)
{
    std::cout << "The file couldnt be opened" << std::endl;
}

nNumberOfBytesToRead = GetFileSize(file, NULL);

BYTE *lpBuffer = new BYTE[nNumberOfBytesToRead];

if (ReadFile(file, lpBuffer, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL))
{
    std::cout << "The file couldnt be read" << std::endl;
}

CancelIo(file);
CloseHandle(file);
delete[] lpBuffer;

system("PAUSE");
return 0;
}

1 Ответ

0 голосов
/ 09 июня 2018

В сообщении об ошибке говорится, что нарушение прав доступа связано с записью адреса памяти 0x00000000.

Это потому, что вы передаете NULL-указатель на параметр lpNumberOfBytesRead ReadFile().

Согласно документации ReadFile() :

lpNumberOfBytesRead [out, необязательно]

Указатель на переменную, которая получает количество прочитанных байтов при использовании синхронного параметра hFile.ReadFile устанавливает это значение на ноль, прежде чем выполнять какую-либо работу или проверку ошибок .Используйте NULL для этого параметра, если это асинхронная операция, чтобы избежать потенциально ошибочных результатов.

Этот параметр может иметь значение NULL, только если параметр lpOverlapped не равен NULL.

Вы передаете NULL на lpOverlapped, поэтому вы НЕ МОЖЕТЕ передать NULL на lpNumberOfBytesRead.Вы ДОЛЖНЫ передать указатель на выделенный DWORD, чтобы получить количество фактически прочитанных байтов, например:

DWORD nNumberOfBytesRead;
...
if (ReadFile(file, lpBuffer, nNumberOfBytesToRead-1, &nNumberOfBytesRead, NULL))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...