1

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 に変更しようとしても、アプリケーションは実行されませんでした。どのような知識が欠けていますか? 値の型が渡されている間、このバッファーはどのように情報を格納できますか?

これは、コードが関数を呼び出して利用可能な Web カメラを取得する方法です。

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
4

1 に答える 1

0

私はこの件についてあまり知らないと言って始めますが (データのマーシャリングは深い話題になる可能性があります)、文字列の既定のマーシャリング(MSDN) が役立つと思います。Fixed-Length String Buffersという部分まで下にスクロールします。これによると、文字列が 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()

非常によく似た質問を見つけました。VB.NET から ANSI C 文字列 "char *" ポインター文字列を使用してアンマネージ C dll をインポートして呼び出すにはどうすればよいですか? .

于 2013-07-10T15:34:36.310 に答える