64位程序引用kernel32.dll, readfile时返回“句柄无效”

happy0423 2018-02-06 05:23:01
最近用C#调用kernel32.dll 编写串口通讯程序(x64),createfile 成功,当调用readfile时失败,通过getlasterror返回“句柄无效”。
查了很久一直怀疑我程序有问题,当我把程序生成平台改成x86时,串口收发数据正常。搞不懂什么原因,贴上部分代码。
/////////
[StructLayout(LayoutKind.Sequential)]
private struct OVERLAPPED
{
public int Internal;
public int InternalHigh;
public int Offset;
public int OffsetHigh;
public int hEvent;
}

//kernel32.dll
[DllImport("kernel32.dll")]
private static extern bool ReadFile(
int hFile, // handle to file
byte[] lpBuffer, // data buffer
int nNumberOfBytesToRead, // number of bytes to read
ref int lpNumberOfBytesRead, // number of bytes read
ref OVERLAPPED lpOverlapped // overlapped buffer
);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool bOK = ReadFile(hComm, recvBuf, NumBytes, ref BytesRead, ref m_ovRead);
if (!bOK)
{
int nRes = GetLastError();
if (nRes == ERROR_IO_PENDING)
{
WaitForSingleObject(m_ovRead.hEvent, this.ReadTimeout);
bOK = GetOverlappedResult(hComm, ref m_ovRead, ref BytesRead, false);
}
}

PS:m_ovRead里面的参数有初始化,有创建event。createfile创建的句柄也正常。
.net自带的serialport为什么不用,有原因,不要深究啦!
...全文
675 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy0423 2018-02-06
  • 打赏
  • 举报
回复
操作系统是64位。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧