【问题标题】:How do I use Overlapped structure with WriteFile API in VB .Net如何在 VB .Net 中使用带有 WriteFile API 的重叠结构
【发布时间】:2017-12-20 14:00:38
【问题描述】:

我使用 VB .Net 调用 Kernel32.dll WriteFile API:

Public Declare Function WriteFile Lib "kernel32" _ ( _ ByVal hFile As IntPtr, _ ByVal lpBuffer As Byte(), _ ByVal nNumberOfBytesToWrite As Int32, _ ByRef lpNumberOfBytesWritten As Int32, _ ByVal lpOverlapped As IntPtr _ ) _ As Boolean

谁能告诉我如何为这个函数创建一个重叠结构(lpOverlapped),以及如何正确传递它(API 需要一个指针?)如果可能,请显示一个工作代码 sn-p...

我发现的所有信息要么没有显示可用的示例,要么对我来说太复杂而无法理解,或者不适合 VB .Net ...

【问题讨论】:

    标签: vb.net api writefile overlapped-io


    【解决方案1】:

    您不需要将指针传递给重叠结构,如果您发现示例过于复杂,请不要使用它。 WinAPI 通常会很复杂,通常更容易直接在 .Net 中完成您需要的工作并避免使用 WinAPI。

    为了回答您的问题,结构将被定义为:

    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 有两个类OverlappedNativeOverlapped,旨在让生活更轻松。 Overlapped 是一个 .Net 类,您可以将 pack 转换为 NativeOverlapped。该结构允许您设置要触发的回调:

    在 C# 中你可以这样定义它:

    Overlapped overlapped = new Overlapped();
    NativeOverlapped* nativeOverlapped = overlapped.Pack(
    DeviceWriteControlIOCompletionCallback,
    null);    
    

    注意我在 C# 中说的,那是因为 Net. doesn't support the return type 在 VB 中是不安全的代码:

    Visual Basic 不支持使用或返回不安全类型的 API。

    因此,如果您真的想做重叠 IO,在 C# 类库中编写重叠方法可能会容易得多,然后您可以在 VB 应用程序中引用和调用。

    来自All API

    · lpOverlapped 指向一个 OVERLAPPED 结构。这种结构是 如果 hFile 是使用 FILE_FLAG_OVERLAPPED 打开的,则需要。如果 hFile 是 用 FILE_FLAG_OVERLAPPED 打开,lpOverlapped 参数不能 为空。它必须指向一个有效的 OVERLAPPED 结构。如果 hFile 是 使用 FILE_FLAG_OVERLAPPED 打开且 lpOverlapped 为 NULL,则 函数可能会错误地报告写操作已完成。 如果 hFile 使用 FILE_FLAG_OVERLAPPED 打开并且 lpOverlapped 不是 NULL,写操作从指定的偏移量开始 OVERLAPPED 结构和 WriteFile 可能在写入之前返回 操作已完成。在这种情况下,WriteFile 返回 FALSE GetLastError 函数返回 ERROR_IO_PENDING。这允许 调用进程在写操作时继续处理 正在完成。 OVERLAPPED 结构中指定的事件是 在写操作完成后设置为信号状态。如果 hFile 未使用 FILE_FLAG_OVERLAPPED 打开,并且 lpOverlapped 是 NULL,写操作从当前文件位置开始, 在操作完成之前,WriteFile 不会返回。如果 hFile 未使用 FILE_FLAG_OVERLAPPED 打开,并且 lpOverlapped 不是 NULL,写操作从指定的偏移量开始 OVERLAPPED 结构和 WriteFile 直到写入才返回 操作已完成。

    【讨论】:

    • 感谢您的详细回复,但是问题是如何创建一个重叠结构可以交给 WriteFile API,以及 如何在 VB .Net 中做到这一点 ...我需要在 VB .Net 中做到这一点,因为整个程序都是用那种语言编写的,而我做不到以任何其他方式,因为我想用 WriteFile 和 Overlapped 明确地测试某些东西(即,如果在没有 FILE_FLAG_OVERLAPPED 的情况下打开文件并且在重叠结构中给出偏移量时写入成功)。可能会解决我在这里提出的问题:stackoverflow.com/questions/45116162
    【解决方案2】:

    大概解决了……我猜是这样的:

    Dim structPtr As IntPtr
    'Create an empty pointer
    structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(my_struct))
    'Copy the structure and data to the pointer in memory
    Marshal.StructureToPtr(my_struct, structPtr, True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2011-11-26
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多