为什么capGetDriverDescription接受缓冲区作为值类型而不是引用类型



在尝试一些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

lpszNameString更改为StringBuilder。显然,StringBuilder将作为缓冲区从函数中取回字符串。

然后你会这样调用你的函数,

StringBuilder sb = new StringBuilder(256)
capGetDriverDescription(Driver, sb, sb.Capacity + 1, ....
return sb.ToString()

我发现了一个非常类似的问题,我如何导入和调用带有ANSI C字符串的非托管C dll";char*";VB.NET中的指针字符串

最新更新