0

wintrust.dllで利用可能な関数CryptCATCatalogInfoFromContextを呼び出したい。しかし、そうすると、指定された配列が予期されたタイプではなかったというエラーが表示されます。 次のコードを使用してメソッドを呼び出しています。私が使用しているデータ型の一部が、必要なデータ型と一致していないようです。

    'import wintrust.dll
    <DllImport("Wintrust.dll", PreserveSig:=True, SetLastError:=False)> _
    Private Shared Function CryptCATCatalogInfoFromContext(ByVal catalogContext As IntPtr, ByVal hash As CATALOG_INFO_, ByVal dwFlags As Integer) As Boolean
    End Function

    'create structure CATALOG_INFO
    <StructLayout(LayoutKind.Sequential)> _
        Public Structure CATALOG_INFO_
        Public cbStruct As UInteger
        <MarshalAs(UnmanagedType.SafeArray)> _
        Public wszCatalogFile() As Char 
    End Structure

すでにCatalogContextを取得しています。

        Dim infoStruct As New CATALOG_INFO_()
        infoStruct.cbStruct = 256
        Dim c(255) As Char
        infoStruct.wszCatalogFile = c
        CryptCATCatalogInfoFromContext(CatalogContext, infoStruct, 0)

最後の行はエラーをスローします指定された配列は予期されたタイプではありませんでした。 配列に間違ったデータ型を使用しましたか?

4

1 に答える 1

1

はい、間違った宣言です。これはSafeArrayではなく、Unicode文字列です。適切な宣言は次のとおりです。

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure CATALOG_INFO
    Public cbStruct As UInteger
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
    Public wszCatalogFile As String
End Structure
于 2012-09-27T19:23:06.270 に答える