2017-07-15 108 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)