64位程序引用kernel32.dll, readfile时返回“句柄无效”
最近用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为什么不用,有原因,不要深究啦!