|
2015/04/10(Fri) 13:23:13 編集(投稿者)
■No75561 (魔界の仮面弁士 さん) に返信
>ただいずれにせよ、構造体側のマーシャリング指定は必要だと思います。 >「文字列型」や「他の構造体」を含んでいる構図体の場合は特に。 >(期待される文字列が、BSTR なのか LPCTSTR なのかなど)
BSTRとして指定しマーシャリングを追加して呼び出しを行うよう下記のように変更して実行してみたのですが、依然として配列の受け渡しに失敗している様子。
< StructLayout( LayoutKind.Sequential, CharSet:=CharSet.Ansi )> Public Structure Structure1 <MarshalAs(UnmanagedType.BStr)> Dim Str1 As String <MarshalAs(UnmanagedType.BStr)> Dim Str2 As String <MarshalAs(UnmanagedType.BStr)> Dim Str3 As String End Structure
Declare Function Test1 Lib "Test.DLL" (<[In], [Out]> ByVal oStructure() As Structure1) As Integer
受け取り側のvoid型のところが、受け取った後にSafeArrayにキャストして別の関数に渡していたので、Void型をSafeArrayに変更し以前と同じ対応としてCom公開をしてみようとしたところ、AssemblyInfo.vbに追加する際にComVisivleおよびGuidを複数回適用することはできないというエラーが表示され設定できませんでした。
以前のご説明では複数の構造体がある場合はAssemblyInfo.vbにも複数追加するという旨が記載されていたと思いますが、この場合どのように定義すればよろしいのでしょうか。
AssemblyInfo.vbは前回築城したもののみとし、今回の構造体にのみ新規作成したGuidを設定してDeclareにもマーシャリングを追加致しましたが、「ライブラリの形式が古いか、または種類が無効です」というエラーが表示され呼び出しに失敗しております。
<ComVisible(True), Guid("2ECC690C-9869-47AD-9DF7-58CF0E44917F")> Public Structure Structure1 Dim Str1 As String Dim Str2 As String Dim Str3 As String End Structure
Declare Function Test1 Lib "Test.DLL" <MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VarEnum.VT_RECORD)> ByVal oStructure() As Structure1) As Integer
お手数ですがお教え頂ければと思います。
以上、宜しくお願い致します。
|