掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
引数が構造体のVBのDLLの関数をVBAから呼び出すには? (ID:147872)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Class1 クラスの下に、T1 構造体を配置しているようですが、 COM 側の名前空間は階層構造に出来ないと思います。 この場合タイプライブラリ上では、T1 ユーザー定義型の位置は Class1 の下層ではなく、Class1 と同等の階層となるでしょう。 VBA 側から見える型名が As ClassLibrary1.T1 になるのか、 それとも、As ClassLibrary1.Class1_T1 になるのかは、 タイプライブラリ次第ですが、いずれにせよ、 ClassLibrary1.Class1.T1 のようにはなれないはずです。 > 「コンパイルエラー:Visual Basicでサポートさけていない > オートメーションが変数で使用されています」 VBA で使われる String 型は、COM 的には「BSTR」と呼ばれる型です。 ユーザー定義型で String 型を用いたい場合には、String 型を BSTR 型にマーシャリングする必要があります。 '---------------------------------------------- Imports System.Runtime.InteropServices Public Class Class1 Public Structure T1 'MarshalAs を指定していない場合は、 <MarshalAs(UnmanagedType.BStr)> Public x As String Public y As Integer End Structure Public Sub fx(ByRef t1_o As T1) MsgBox(t1_o.x & t1_o.y) End Sub End Class '---------------------------------------------- Public vb_o As New ClassLibrary1.Class1 Public Sub test() Dim t_o As T1 t_o.x = "Hello," & ChrW(&H4F60) & "好" t_o.y = 123 Call vb_o.fx(t_o) End Sub '---------------------------------------------- > call vb_o.fx(t_o) 現状のコードだと、VBA 側で「fx」がコード補完されない気がします。 レイトバインドにて呼び出せるので、今のコードでも問題は無いですが、 VBA 側の IntelliSense を使えるようにしたいのであれば、 インターフェイスを明示実装した上で、ClassInterfaceType.None を 指定しておくとよいでしょう。 Imports System.Runtime.InteropServices <ClassInterface(ClassInterfaceType.None)> _ Public Class Class1 Implements IClass1 Public Structure T1 <MarshalAs(UnmanagedType.BStr)> _ Public x As String Public y As Integer End Structure Public Sub fx(ByRef t1_o As T1) Implements IClass1.fx MsgBox(t1_o.x & t1_o.y) End Sub Public Interface IClass1 Sub fx(ByRef t1_o As T1) End Interface End Class 余力があれば、GuidAttribute も指定しておくと安全です。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.