tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^6: Declareステートメントで定義されたアンマネージdll関数呼出について
投稿日: 2010/12/29(Wed) 10:50
投稿者テイラー
> ソースの概略を載せて説明されたほうがよいかと思います。
> dllのクラス、各ヘッダ
> 呼び出し側の使い方など

アドバイスありがとうございます。遅レスで申し訳ないですが、なにぶん悩んだ末記述が増えている状態なのでご容赦を・・・

VBクラスライブラリ(ファイル名はLib_Fun_vb.dll)の構成が、

'型宣言部
<StructLayoutAttribute(LayoutKind.Sequential)> Public Structure Structure1
    <MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst:=31)> Public Array1 As Integer()
    <MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst:=31)> Public Array2 As Integer()
    Public Sub New(ByVal num As Integer)
        '...何らかの処理

    End Sub
End Structure
<StructLayoutAttribute(LayoutKind.Sequential)> Public Structure Structure2
    Public Number As Long
    Public text() As String
    Public Sub New(ByVal num As Integer)
        '...何らかの処理

    End Sub
End Structure
<StructLayoutAttribute(LayoutKind.Sequential)> Public Structure Structure3
    Public num() As Integer
    Public X As Double
    Public Y As Double
    <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=256)> Public Structure_Name As String
    Public Sub New(ByVal num As Integer)
        '...何らかの処理

    End Sub
End Structure

'アンマネージdll定義
Public Class Lib_Fun_Static
    Private Prop1 As String
    Private Prop2 As String
   '...

   'Property
    Public Property Property_1() As String
        Get
            Return Me.Prop1
        End Get
        Set(ByVal value As String)
            Me.Prop1 = value
        End Set
    End Property
    Public Property Property_2() As String
        Get
            Return Me.Prop2
        End Get
        Set(ByVal value As String)
            Me.Prop2 = value
        End Set
    End Property
   '...

    '下記の関数の一群には内部データを持たせています。
    Public Declare Function Function_1 Lib "アンマネージdllのファイル名" (ByVal Str1 As Structure1, ByRef Str2 As Structure2) As Boolean
    Public Declare Function Function_2 Lib "アンマネージdllのファイル名" (ByRef Str3 As Structure3) As Boolean
   '...
End Class
'
'
'アンマネージdllラッパー
Public Class Lib_Fun_w
    Private Fun_Static As New Lib_Fun_Static
    Public Property Property_1() As String
        Get
            Return Me.Fun_Static.Property_1
        End Get
        Set(ByVal value As String)
            Me.Fun_Static.Property_1 = value
        End Set
    End Property
    Public Property Property_2() As String
        Get
            Return Me.Fun_Static.Property_2
        End Get
        Set(ByVal value As String)
            Me.Fun_Static.Property_2 = value
        End Set
    End Property

    Public Function Function_1(ByVal Str1 As Structure1, ByRef Str2 As Structure2) As Boolean
        Function_1 = Me.Fun_Static.Function_1(Str1, Str2)
    End Function
    Public Function Function_2(ByRef Str3 As Structure3) As Boolean
        Function_2 = Me.Fun_Static.Function_2(Str3)
    End Function
End Class

という形になっています。一方で、呼び出し側のMDIアプリケーションでは呼び出しクラスを構築してあり、


Imports Lib_Fun_vb
Public Class Lib_Fun_dll
    Public dll_Path As String
    Public Lib_Fun_Assembly As Reflection.Assembly
    Public Lib_Handle As New Object

    'Methode List
    Public Property_1 As System.Reflection.PropertyInfo
    Public Property_2 As System.Reflection.PropertyInfo
    '...

    Public Function_1 As System.Reflection.MethodInfo
    Public Function_2 As System.Reflection.MethodInfo
    '...

    Public Sub New()
        MyBase.New()
        Call Me.Library_Loader()
    End Sub
    Public Sub Library_Loader()
        Me.dll_Path = "Lib_Fun_vb.dll"
        Me.Lib_Fun_Assembly = System.Reflection.Assembly.LoadFrom(Me.dll_Path)
        Me.Lib_Handle = Me.Lib_Fun_Assembly.CreateInstance(Me.dll_Path & ".Lib_Fun_w")
        'Property Get Procedure
        Me.Property_1 = Me.Lib_Handle.GetType.GetProperty("Property_1")
        Me.Property_2 = Me.Lib_Handle.GetType.GetProperty("Property_2")
        '...

        'Methode Get Procedure
        Me.Function_1 = Me.Lib_Handle.GetType.GetMethod("Function_1")
        Me.Function_2 = Me.Lib_Handle.GetType.GetMethod("Function_2")
        '...
    End Sub
End Class

Public Class Lib_Fun
    Private LibFun_dll As New Lib_Fun_dll()
    Private Property Lib_Handle() As Object
        Get
            Return Me.LibFun_dll.Lib_Handle
        End Get
        Set(ByVal value As Object)
            Me.LibFun_dll.Lib_Handle = value
        End Set
    End Property

   'Property Set
    Public Property Property_1() As String
        Get
            Return Me.LibFun_dll.Property_1.GetValue(Me.Lib_Handle, Nothing)
        End Get
        Set(ByVal value As String)
            Me.LibFun_dll.Property_1.SetValue(Me.Lib_Handle, value, Nothing)
        End Set
    End Property
    Public Property Property_2() As String
        Get
            Return Me.LibFun_dll.Property_2.GetValue(Me.Lib_Handle, Nothing)
        End Get
        Set(ByVal value As String)
            Me.LibFun_dll.Property_2.SetValue(Me.Lib_Handle, value, Nothing)
        End Set
    End Property
    '...

    'Methode Call
    Public Function Function_1(ByVal Str1 As Structure1, ByRef Str2 As Structure2) As Boolean
        Dim Methode_Parameter() As Object = {Str1, Str2}
        Function_1 = Me.LibFun_dll.Function_1.Invoke(Me.Lib_Handle, Methode_Parameter)
        Str2 = Methode_Parameter(1)
    End Function
    Public Function Function_2(ByRef Str3 As Structure3) As Boolean
        Dim Methode_Parameter() As Object = {Str3}
        Function_2 = Me.LibFun_dll.Function_2.Invoke(Me.Lib_Handle, Methode_Parameter)
        Cls2 = Methode_Parameter(0)
    End Function

End Class


などと構成してあり、MDIアプリケーションの文書子フォームではLib_FunクラスをNewで用いるようにしてあります。
ほとんど見た目にはLib_Funクラスのインスタンスを用いるのも、Lib_Fun_Staticクラスを用いるのも一緒のようにも見えます。
正直、どの様に振舞うのかはやってみて確認、という事だった訳ですが、VBのプロパティ変数はNewの度に新しいインスタンスを生成したようなので、
Declare宣言にしてあるdll関数を何とかすれば良いのではないかと言う状態です。

上記のコード例は読むのに手間がかかりますが(混乱を深めているとも)、もっと単純に扱える手段があればアドバイス頂ければと思います。

よろしくお願い申し上げます。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。