【发布时间】:2014-07-03 11:29:55
【问题描述】:
我正在尝试开发一种与电子卡通信的功能。我需要使用 readFile() 函数:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadFile(IntPtr hFile, ref byte lpBuffer,
uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, Overlapped lpOverlapped);
我的功能是:
EventObject = CreateEvent(IntPtr.Zero,true,true,"");
lastError = Marshal.GetLastWin32Error();
HIDOverlapped = new System.Threading.Overlapped();
HIDOverlapped.OffsetLow = 0;
HIDOverlapped.OffsetHigh = 0;
HIDOverlapped.EventHandleIntPtr = EventObject;
readHandle = CreateFile(MyDeviceInterfaceDetailData.DevicePath, (GENERIC_READ | GENERIC_WRITE), (FILE_SHARE_READ | FILE_SHARE_WRITE), IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero);
uint numberOfBytesRead;
readBuffer= new byte[8];
string byteValue;
bool result = ReadFile(readHandle, ref readBuffer[0], (uint)capabilities.InputReportByteLength, out numberOfBytesRead, HIDOverlapped);
lastError = Marshal.GetLastWin32Error(); //Problem
最后一行函数Marshal.GetLastWin32Error()返回错误码997。
在第二段中,出现另一个错误,代码为 0xc0000005 (FatalExecutionEngineError) 并且软件崩溃。
你知道我可以尝试什么吗?
【问题讨论】:
-
错误代码 997 是“Overlapped I/O operation is in progress”,您可能需要将此信息添加到问题中。
-
顺便说一句。您不必使用 CreateEvent 函数。有围绕它的包装类。查看
WaitHandle类型及其SafeWaitHandle属性。 -
您是否尝试过不同的 pinvoke 声明?见:http://www.pinvoke.net/default.aspx/kernel32.readfile
-
你的错误检查在任何情况下都是错误的。如果 API 调用失败,则不一定会设置
GetLastError。您仍然需要检查返回值是否失败。