タイトル | : Re^6: Declareステートメントで定義されたアンマネージdll関数呼出について |
記事No | : 10393 |
投稿日 | : 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関数を何とかすれば良いのではないかと言う状態です。
上記のコード例は読むのに手間がかかりますが(混乱を深めているとも)、もっと単純に扱える手段があればアドバイス頂ければと思います。
よろしくお願い申し上げます。
|