0

我使用 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需要一个指针?)如果可能的话,请显示一个工作代码片段......

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

4

2 回答 2

1

可能解决了......我想它是这样完成的:

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)
于 2017-07-16T07:46:33.470 回答
0

您不需要将指针传递给重叠结构,如果您发现示例太复杂,请不要使用它。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 有两个类OverlappedNativeOverlapped旨在让生活更轻松。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 在写入操作完成之前不会返回。

于 2017-07-15T17:42:02.270 回答