使用ReadFile无效访问内存位置

时间:2018-02-06 18:54:35

标签: c++ c windows winapi

我有一个文件 C:\ demo \ Demo.txt ,它有一个简单的" Hello,world "在上面。我想将路径作为参数传递给我的应用程序,用CreateFile打开它,用ReadFile读取它并在控制台上显示该行。但是,我收到错误代码998

  

对内存位置的无效访问。

这是我的代码:

int wmain(int argc, WCHAR **argv)
{
    if (argc != 2)
    {
        fwprintf(stderr, L"\nWrong arguments. \n");
        return 1;
    }

    // CreateFile function variables
    HANDLE hSourceFile;
    LPCWSTR fileName = (LPCWSTR)argv[1];
    DWORD desiredAccess = FILE_GENERIC_READ;
    DWORD shareMode = FILE_SHARE_READ;
    DWORD creationDisposition = OPEN_EXISTING;
    DWORD flagsAndAttributes = FILE_ATTRIBUTE_NORMAL;

    //---------------------------------------------------------------
    // Opening file for reading data
    hSourceFile = CreateFileW(
        fileName,
        desiredAccess,
        shareMode,
        NULL,
        creationDisposition,
        flagsAndAttributes,
        NULL);

    if (hSourceFile != INVALID_HANDLE_VALUE)
    {
        wprintf(L"\nThe source file, %s, is open. \n", fileName);
    }
    else
    {
        wprintf(L"Error code: %u\n", GetLastError());
    }

    // ReadFile function variables
    LPVOID dataRead=NULL;
    DWORD bytesToRead = 100;
    DWORD bytesWritten = 0;

    //-----------------------------------------------------------------
    // Reading data from file
    if (!ReadFile(
        hSourceFile,
        dataRead,
        bytesToRead,
        &bytesWritten,
        NULL))
    {
        wprintf(L"Error code: %u\n", GetLastError());
        return 1;

    }

    wprintf(L"%s. \n", (LPWSTR)dataRead);   


    CloseHandle(hSourceFile);

    return 0;
}

我第一次使用ReadFile,所以不知道我做错了什么。

你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

index想要一个指向缓冲区的指针,它可以将数据写入其中。您正在传递NULL,因此您会收到错误。

我会将代码更改为

ReadFile

您遇到的下一个问题是,您正在将指针转换为 // ReadFile function variables static const DWORD bytesToRead = 100; unsigned char dataRead[bytesToRead]; DWORD bytesWritten = 0; //----------------------------------------------------------------- // Reading data from file if (!ReadFile( hSourceFile, dataRead, bytesToRead, &bytesWritten, NULL)) { wprintf(L"Error code: %u\n", GetLastError()); return 1; } ,这是指向以null结尾的宽字符串的指针。您的文件是否包含该空终止?或者你需要自己添加吗?假设文件包含终止,您可能需要:

LPWSTR

答案 1 :(得分:1)

您必须在要将读取字节放入的位置分配内存缓冲区。现在你指针dataRead指向nullptr,换句话说无处,但你传递的大小为100,表明你的指针指向100字节分配的缓冲区,这不是真理。