2017-07-15 103 views
-1

我使用VB .NET来调用的Kernel32.dll WriteFile的API:如何使用也是跟WriteFile API重叠的结构在VB.NET中

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 ...

回答

0

您不需要将指针传递给重叠结构,并且如果发现这些示例太复杂,请不要使用它。 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 

然而,的Sy​​stem.Threading有两类OverlappedNativeOverlapped旨在使生活更轻松。 Overlapped是一个.Net类,您可以将pack转换为NativeOverlapped。结构允许您设置回拨被解雇:

在C#中,你将它定义成这样:

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

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

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

所以,如果你真的希望做的重叠IO,这可能是一个更容易为你的代码放在一个C#类库,然后你就可以引用和VB应用程序调用你的重叠方法。

All 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,则写入操作从OLELAPPED结构中指定的偏移量开始,并且在写入 操作完成之前,WriteFile可能会返回。在这种情况下,WriteFile返回FALSE 并且GetLastError函数返回ERROR_IO_PENDING。这允许 调用进程继续处理,而写入操作 正在完成。 OVERLAPPED结构中指定的事件是 ,在写入操作完成后设置为发信号状态。如果 h文件未通过FILE_FLAG_OVERLAPPED打开并且lpOverlapped为 NULL,则写入操作从当前文件位置开始,并且 在操作完成之前WriteFile不会返回。如果 h文件未通过FILE_FLAG_OVERLAPPED打开且lpOverlapped不为 NULL,则写入操作从 OVERLAPPED结构中指定的偏移量开始,并且直到写入 操作完成,WriteFile才会返回。

+0

感谢您的相关详细回应,但* *的问题是如何创建一个重叠的结构*可以交给WriteFile的API *,以及*如何在VB.Net *中做到这一点... ... 我*需要*在VB.Net中这样做,因为整个程序已经用该语言编写,而且我不能在任何其他方式,因为我想用WriteFile和Overlapped来明确地测试一些东西(即,如果在没有FILE_FLAG_OVERLAPPED的情况下打开文件并且在重叠结构中给出偏移,则写入成功)。可能解决我在这里陈述的问题:https://stackoverflow.com/questions/45116162/ – N00b

0

可能已经解决......我想它做这样的:

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)