嘗試一些API編程,我遇到了AVICAP32.dll的capGetDriverDescription功能的問題:爲什麼capGetDriverDescription接受緩衝區作爲值類型而不是引用類型?
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _
ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, _
ByVal cbVer As Integer) As Boolean
據我所知,lpszName
參數是讓司機描述的緩衝區,而我讀的地方緩衝區應該作爲參考類型傳遞(ByRef
而不是ByVal
),當然它應該是一個參考,因爲從函數返回後存儲我需要的信息。但是在這個函數中,它是一個值類型,它工作正常! 即使我試圖將其更改爲ByRef,但應用程序沒有運行! 我缺少什麼知識?這個緩衝區在傳遞值類型時如何存儲我的信息?
這是怎樣的代碼調用函數來獲取可用的攝像頭:
Private Sub LoadDeviceList()
On Error Resume Next
Dim strName As String = Space(100)
Dim strVer As String = Space(100)
Dim bReturn As Boolean
Dim x As Integer = 0
Do
bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
If bReturn Then
lst1.Items.Add(strName.Trim)
End If
x += 1
Application.DoEvents()
Loop Until bReturn = False
End Sub
感謝您的回答,我使用的示例不使用任何StringBuilder。它只是在函數中使用正常字符串,因爲我粘貼了我的問題。此示例在調用函數時也使用普通字符串。但這個代碼仍然有效!順便說一下,我應該從哪裏開始學習使用dll? –
對不起,我沒有足夠的聲望來投票你的答案 –
是的,它將使用普通的字符串,你只需要使用StringBuilder來獲得結果。我不確定是否有任何地方可以學習這個東西(除Stack Overflow之外),但是http://pinvoke.net/是查找流行函數和數據結構的.NET定義的絕佳網站。 – Kratz