DOBON.NET DOBON.NETプログラミング掲示板過去ログ

COM相互運用DLL(VB.Net)とVBScriptでの配列受け渡し

  • 題名: COM相互運用DLL(VB.Net)とVBScriptでの配列受け渡し
  • 著者: haru
  • 日時: 2006/11/17 11:45:37
  • ID: 18260
  • この記事の返信元:
    • (なし)
  • この記事への返信:
    • (なし)
  • ツリーを表示
環境/言語:[WindowsXP/VB.Net/.Net Framework(1.0)]
分類:[.NET]

MSDNフォーラムとマルチポストです。ごめんなさい。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=928592&SiteID=7

VB.Netで、COM相互運用のDLLを作りました。
(プロジェクトのプロパティで、[COM の相互運用機能に登録]をオン)
そのDLLのクラスを、VBScriptから使いたいのですが、
配列の引数のあるメソッドを呼び出すと以下のエラーになります。

「プロシージャの呼び出し、または引数が不正です」(800A0005)

COM(VB.Net)とVBスクリプトのコードは以下のような感じです。

-------------------------------------------
■COMライブラリ(クラス:XXXXXX.YYYYYY)

Public Sub test01(ByVal num As Integer, ByRef strbuf() As String)
Dim i As Integer
For i = 1 To num
strbuf(i) = i.ToString
Next
End Sub

■VBScriptのコード

Dim aObj
Dim mCol(10)

Set aObj = CreateObject("XXXXXX.YYYYYY")
aObj.test01 10, mCol
msgbox mCol(1)
---------------------------------------------

相互運用するには、VB.Net側でマーシャリングが必要かな、と思い、
COMのコードを、以下のようにしてもみたのですが、この場合は、
「VBScriptでサポートされていないオートメーションが変数で使用されています。」
のエラーになります。

---------------------------------------------
Public Sub test01(ByVal num As Integer, <MarshalAs(UnmanagedType.LPArray)> ByRef strbuf() As String)
Dim i As Integer

For i = 1 To num
strbuf(i) = i.ToString
Next

End Sub
---------------------------------------------

 (LPArrayのところはSafeArrayやAsAnyでも同じでした)

また、VBScriptとCOM(VB6.0)の場合は、COM側のメソッドを、
---------------------------------------------
Public Sub test01(num As Integer, ByRef bufVar As Variant)
If IsArray(bufVar) Then
Dim i As Integer
For i = 1 To num
bufVar(i) = i
Next i
End If
End Sub
---------------------------------------------
というように 引数をVariantにすると受け渡すことができたのですが、
VB.Netでは、Variantという型はなく、Objectになってしまいます。
Objectとすると、やはりエラーになります。


具体的なコード例などがあればとてもうれしいです。
どうぞよろしくお願いいたします。

DOBON.NET | プログラミング道 | プログラミング掲示板