WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

用户名

我在下面编写了此代码,并使用mingw gcc 4.7在code :: blocks下很好地进行了编译。从那以后,我决定开始使用Visual Studio 2013 Express。现在,在调用ReadFile()时出现错误。这似乎是无效的参数。我看不到错误,希望有人能发现它。

所有这些都包装在类Serial中。从我在IDE中看到的内容来看,与引用CreateFile()返回到句柄相比,m_hSerial的内存引用是正确的。

m_hSerial = CreateFile(m_pchPort,
                       GENERIC_READ | GENERIC_WRITE,
                       0,
                       0,
                       OPEN_EXISTING,
                       FILE_FLAG_OVERLAPPED,
                       0);

我这样称呼WorkThread

m_hThread = (HANDLE)_beginthreadex(0, 0, &WorkThread, (void*) this, 0, 0);

这是WorkThread代码

unsigned int __stdcall Serial::WorkThread(void* pvParam)
{
// This is a pointer to the 'this' serial class.
// Needed to be able to set members of the class in a static class function
Serial * cThis = (Serial*) pvParam;
// Set up the overlapped event
OVERLAPPED ov;
memset(&ov, 0, sizeof(ov));
ov.hEvent = CreateEvent(0, true, 0, 0);
DWORD dwEventMask = 0;
DWORD dwWait;
HANDLE aHandles[2];
aHandles[0] = cThis->m_hThreadTerminator;
aHandles[1] = ov.hEvent;

SetEvent(cThis->m_hThreadRunning);
while (true)
{
    if (!WaitCommEvent(cThis->m_hSerial, &dwEventMask, &ov))
    {
        assert(GetLastError() == ERROR_IO_PENDING);

    }

    dwWait = WaitForMultipleObjects(2, aHandles, FALSE, INFINITE);
    switch(dwWait)
    {
        case WAIT_OBJECT_0:
        {
            _endthreadex(1);
        }
        case WAIT_OBJECT_0 + 1:
        {
            if (dwEventMask & EV_TXEMPTY)
            {
                ResetEvent(ov.hEvent);
            }
            else if (dwEventMask & EV_RXCHAR)
            {
                // read data here
                DWORD dwBytesRead = 0;
                DWORD dwErrors;
                COMSTAT cStat;
                OVERLAPPED ovRead;
                ovRead.hEvent = CreateEvent(0, true, 0, 0);

                // Get the Bytes in queue
                ClearCommError(cThis->m_hSerial, &dwErrors, &cStat);
                DWORD nSize = cStat.cbInQue;
                // EM_REPLACESEL needs a LPARAM null terminated string, make room and set the CString NULL
                char *szBuf = new char[nSize+1];
                memset(szBuf, 0x00, sizeof(szBuf));

                if (!ReadFile(cThis->m_hSerial, &szBuf, nSize, &dwBytesRead, &ovRead))
                    DWORD err = GetLastError();
                if (dwBytesRead == nSize)
                    SendMessage(cThis->m_hHwnd, WM_SERIAL, 0, LPARAM(&szBuf));

                CloseHandle(ovRead.hEvent); // clean up!!!
                delete[] szBuf;
            }
            // Reset the overlapped event
            ResetEvent(ov.hEvent);
        }
        break;
    }//switch
}

return 0;

}

戴维·赫弗南
ReadFile(cThis->m_hSerial, &szBuf, nSize, &dwBytesRead, &ovRead)

您既要进行异步操作,又要使函数告诉您已读取了多少字节。您将其&dwBytesRead作为倒数第二个参数传递当您执行重叠读取时,请传递NULL此参数。文件说:

如果这是异步操作,请对该参数使用NULL以避免潜在的错误结果。

传递&szBuf上面的代码也是错误的你的意思是通过szBuf

您也无法初始化该OVERLAPPED结构。这样做:

OVERLAPPED ovRead = {};

更大的问题是您要求异步访问,但由于它是同步的而编写代码。一旦ReadFile返回,您就会尝试从中获取有意义的信息,dwBytesRead并关闭放入重叠结构中的事件。

如果您真的要异步编写代码,则需要重新编写代码以实现异步。从表面上看,您似乎似乎尚未完全了解重叠I / O的含义,您可能应该切换到非重叠的同步I / O。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

来自分类Dev

WinHttpSendRequest返回ERROR_INVALID_PARAMETER

来自分类Dev

ReadMsgQueue返回ERROR_INVALID_PARAMETER

来自分类Dev

ReadMsgQueue返回ERROR_INVALID_PARAMETER

来自分类Dev

Win8中永远不会返回SetSuspendState()API

来自分类Dev

Win32 API:GetLastError()与FormatMessage()一起打印出一个垃圾

来自分类Dev

查询蓝牙设备时,SetupDiEnumDeviceInterfaces返回ERROR_INVALID_PARAMETER

来自分类Dev

Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

来自分类Dev

Delphi-调用Win API

来自分类Dev

[WIN API]为什么WriteFile(sync)和ReadFile(sync)共享同一个HANDLE会导致ReadFile错误?

来自分类Dev

使用win32api python捕获屏幕截图会返回黑色图像

来自分类Dev

(C ++)使用g ++返回“对WinMain @ 16的未定义引用”的Win32 API示例代码

来自分类Dev

Windows设备文件未使用python win32API返回有效句柄

来自分类Dev

如果第二个参数是LPWSTR,则Win32 API Visual C ++ ReadFile()函数将产生乱码

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Python Win32API位图.GetBitmapBits()

来自分类Dev

如何禁用按钮-Win32 API

来自分类Dev

Win32 API SearchPath失败

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Java到Win32加密API

来自分类Dev

Win32 API 无法 CreateWindowW()

来自分类Dev

Win API 对齐按钮上的文本

来自分类Dev

禁用快速编辑模式时,SetConsoleMode返回ERROR_INVALID_PARAMETER

来自分类Dev

带有FSCTL_SET_ZERO_DATA的DeviceIoControl返回ERROR_INVALID_PARAMETER

来自分类Dev

Win32 API GetMenuItemInfo仅返回项目文本的第一个字符

来自分类Dev

AttributeError:模块“ win32ctypes.pywin32.win32api”没有属性“错误”

来自分类Dev

Win32API / Win驱动程序:如何检测是否访问了文件

来自分类Dev

Windows:如何拦截Win32磁盘I / O API

来自分类Dev

调用win32 API并回调类函数

Related 相关文章

  1. 1

    WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

  2. 2

    WinHttpSendRequest返回ERROR_INVALID_PARAMETER

  3. 3

    ReadMsgQueue返回ERROR_INVALID_PARAMETER

  4. 4

    ReadMsgQueue返回ERROR_INVALID_PARAMETER

  5. 5

    Win8中永远不会返回SetSuspendState()API

  6. 6

    Win32 API:GetLastError()与FormatMessage()一起打印出一个垃圾

  7. 7

    查询蓝牙设备时,SetupDiEnumDeviceInterfaces返回ERROR_INVALID_PARAMETER

  8. 8

    Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

  9. 9

    Delphi-调用Win API

  10. 10

    [WIN API]为什么WriteFile(sync)和ReadFile(sync)共享同一个HANDLE会导致ReadFile错误?

  11. 11

    使用win32api python捕获屏幕截图会返回黑色图像

  12. 12

    (C ++)使用g ++返回“对WinMain @ 16的未定义引用”的Win32 API示例代码

  13. 13

    Windows设备文件未使用python win32API返回有效句柄

  14. 14

    如果第二个参数是LPWSTR,则Win32 API Visual C ++ ReadFile()函数将产生乱码

  15. 15

    GetGuiResources WIn32 API使用

  16. 16

    Python Win32API位图.GetBitmapBits()

  17. 17

    如何禁用按钮-Win32 API

  18. 18

    Win32 API SearchPath失败

  19. 19

    GetGuiResources WIn32 API使用

  20. 20

    Java到Win32加密API

  21. 21

    Win32 API 无法 CreateWindowW()

  22. 22

    Win API 对齐按钮上的文本

  23. 23

    禁用快速编辑模式时,SetConsoleMode返回ERROR_INVALID_PARAMETER

  24. 24

    带有FSCTL_SET_ZERO_DATA的DeviceIoControl返回ERROR_INVALID_PARAMETER

  25. 25

    Win32 API GetMenuItemInfo仅返回项目文本的第一个字符

  26. 26

    AttributeError:模块“ win32ctypes.pywin32.win32api”没有属性“错误”

  27. 27

    Win32API / Win驱动程序:如何检测是否访问了文件

  28. 28

    Windows:如何拦截Win32磁盘I / O API

  29. 29

    调用win32 API并回调类函数

热门标签

归档