在尝试一些API编程时,我遇到了AVICAP32.dll:的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
我首先会说我对这个主题了解不多(封送数据可能是一个很深的主题),但我认为字符串默认封送(MSDN)可能会对您有所帮助。向下滚动到显示固定长度字符串缓冲区的部分。据此,当字符串被封送到API时,即使通过Ref传递,被调用方也不能修改它。
我还没有测试,但根据MSDN的例子,为了从函数中获取值,定义将变为
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _
ByVal lpszName As StringBuilder, ByVal cbName As Integer, ByVal lpszVer As String, _
ByVal cbVer As Integer) As Boolean
将lpszName
从String
更改为StringBuilder
。显然,StringBuilder
将作为缓冲区从函数中取回字符串。
然后你会这样调用你的函数,
StringBuilder sb = new StringBuilder(256)
capGetDriverDescription(Driver, sb, sb.Capacity + 1, ....
return sb.ToString()
我发现了一个非常类似的问题,我如何导入和调用带有ANSI C字符串的非托管C dll";char*";VB.NET中的指针字符串。