EXEからActiveX DLLへユーザー定義型を引数にする


hou  2005-08-14 00:22:56  No: 91486

ユーザー定義型を引数にしようと思いコンパイルしたところ、
「パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、クラスモジュール内のパブリックユーザー定義型の要素として使用することができます。」というエラーメッセージが出てしまいます。
過去ログも確認しましたが、VBを始めたばかりの完全な素人の為理解できませんでした。申し訳ございませんが、以下のコードの間違いをご教授お願い致します。

[EXE  Form]
Private Sub Command1_Click()    
    Dim obj1 As Object
    Dim rtn As Integer
    Dim t1  As typ1
    
    Set obj1 = CreateObject("dll1.Class1")
    
    t1.a1 = "1"
    t1.a2 = "2"    
    rtn = obj1.Mt2(t1)    
End Sub

[EXE  Module]
Public Type typ1
    a1  As String
    a2  As String
End Type
Public t1   As typ1

[ActiveXDLL  Class]
Type typ1
    a1  As String
    a2  As String
End Type
----------------------------
Public Function Mt2(t1 As typ1) As Integer    
    Mt2 = 3        
End Function


魔界の仮面弁士  2005-08-14 11:14:38  No: 91487

> 理解できませんでした。
といわれましても、では何を説明すれば良いのか困ってしまいます。
こういう時には、過去ログのうち、どの部分までが理解できていて、
どの部分が分からなかったのかを教えていただけるとありがたいです。

1. 標準モジュールで定義されたユーザー定義型は、Public Functionの
  引数には使えません。ユーザー定義型を引数に指定する場合は、それを
  「パブリック オブジェクト モジュールで定義」しておく必要があります。

  これは言い換えると、ActiveX DLL(または ActiveX EXE等)の
  クラスモジュールにてPublic Type宣言せねばならないという事です。
  (クラスモジュールは、Instancingプロパティを「Private以外」に
  設定しておく必要があります)

2. 呼び出し側のユーザー定義型と、DLL側のユーザー定義型は、
   たとえ型名やメンバ構造が一緒だったとしても、別物として扱われます。
  ですから、呼び出し側で新たにユーザー定義型を宣言するのではなく、
  そのDLLを「参照設定」して、そのDLL内で定義されたデータ型を
  利用するようにしてみてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加