您不需要将指针传递给重叠结构,如果您发现示例太复杂,请不要使用它。WinAPI 通常可能很复杂,并且通常更容易直接在 .Net 中完成您需要的工作并避免 WinAPI altogehter。
为了回答您的问题,结构将被定义为:
Public Structure OVERLAPPED
Public Internal As Long
Public InternalHigh As Long
Public offset As Long
Public OffsetHigh As Long
Public hEvent As Long
End Structure
但是,System.Threading 有两个类Overlapped
,NativeOverlapped
旨在让生活更轻松。Overlapped
是一个 .Net 类,您可以将其pack
放入NativeOverlapped
. 该结构允许您设置要触发的回调:
在 C# 中,您可以这样定义它:
Overlapped overlapped = new Overlapped();
NativeOverlapped* nativeOverlapped = overlapped.Pack(
DeviceWriteControlIOCompletionCallback,
null);
注意我在 C# 中说,那是因为 Net. 不支持VB 中的返回类型,因为它是不安全的代码:
Visual Basic 不支持使用或返回不安全类型的 API。
因此,如果您真的想做重叠 IO,在 C# 类库中编写重叠方法可能会容易得多,然后您可以在 VB 应用程序中引用和调用它。
来自所有 API:
· lpOverlapped 指向一个OVERLAPPED 结构。如果使用 FILE_FLAG_OVERLAPPED 打开 hFile,则需要此结构。如果使用 FILE_FLAG_OVERLAPPED 打开 hFile,则 lpOverlapped 参数不得为 NULL。它必须指向一个有效的 OVERLAPPED 结构。如果使用 FILE_FLAG_OVERLAPPED 打开 hFile 并且 lpOverlapped 为 NULL,则该函数可能会错误地报告写操作已完成。如果使用 FILE_FLAG_OVERLAPPED 打开 hFile 并且 lpOverlapped 不为 NULL,则写入操作从 OVERLAPPED 结构中指定的偏移量开始,并且 WriteFile 可能会在写入操作完成之前返回。在这种情况下,WriteFile 返回 FALSE,GetLastError 函数返回 ERROR_IO_PENDING。这允许调用进程在写操作完成时继续处理。OVERLAPPED 结构中指定的事件在写操作完成时设置为信号状态。如果未使用 FILE_FLAG_OVERLAPPED 打开 hFile 并且 lpOverlapped 为 NULL,则写入操作从当前文件位置开始,并且 WriteFile 在操作完成之前不会返回。如果未使用 FILE_FLAG_OVERLAPPED 打开 hFile 并且 lpOverlapped 不为 NULL,则写入操作从 OVERLAPPED 结构中指定的偏移量开始,并且 WriteFile 在写入操作完成之前不会返回。写操作从当前文件位置开始,直到操作完成,WriteFile 才会返回。如果未使用 FILE_FLAG_OVERLAPPED 打开 hFile 并且 lpOverlapped 不为 NULL,则写入操作从 OVERLAPPED 结构中指定的偏移量开始,并且 WriteFile 在写入操作完成之前不会返回。写操作从当前文件位置开始,直到操作完成,WriteFile 才会返回。如果未使用 FILE_FLAG_OVERLAPPED 打开 hFile 并且 lpOverlapped 不为 NULL,则写入操作从 OVERLAPPED 结构中指定的偏移量开始,并且 WriteFile 在写入操作完成之前不会返回。