vb.netアプリから自作DLLを呼び出してみます。
前回の結果から、実行ファイルが、
C:\Users\hoge\Documents\vb-vscode\projects\dllcallstudy1\dllcallapp1\bin\x86\Debug\net5.0
に生成されることがわかったので、こちらに32bit DLLを64bitアプリから使う(1)で作ったMyDLL32.dllをコピペしておきます。
そして
Program.vb
Imports System
Imports System.Runtime.InteropServices
Module Program
Delegate Function tasu_dgt(Byval arg1 As Int32,Byval arg2 As Int32) As Int32
Delegate Function hiku_dgt(Byval arg1 As Int32,Byval arg2 As Int32) As Int32
Private ptasu As IntPtr
Private phiku As IntPtr
Private tasu As tasu_dgt
Private hiku As hiku_dgt
Private _libraryModule_mydll As IntPtr=IntPtr.Zero
<DllImport("kernel32",CharSet:=CharSet.Ansi,SetLastError:=True)>
Private Function LoadLibrary(Byval lpFileName As String) As IntPtr
End Function
<DllImport("kernel32",CharSet:=CharSet.Ansi,SetLastError:=True)>
Private Function FreeLibrary(Byval hModule As IntPtr) As Boolean
End Function
<DllImport("kernel32",CharSet:=CharSet.Ansi,SetLastError:=True)>
Private Function GetProcAddress(Byval hModule As IntPtr,Byval lpProcName As String) As IntPtr
End Function
Sub Main(args As String())
dim wa,sa,arg1,arg2 as Int32
dim output as String
Console.WriteLine("Hello World!")
_libraryModule_mydll=LoadLibrary("MyDLL32.dll")
ptasu=GetProcAddress(_libraryModule_mydll,"tasu")
tasu=Marshal.GetDelegateForFunctionPointer(ptasu,GetType(tasu_dgt))
phiku=GetProcAddress(_libraryModule_mydll,"hiku")
hiku=Marshal.GetDelegateForFunctionPointer(phiku,GetType(hiku_dgt))
arg1=20
arg2=13
wa=tasu(arg1,arg2)
sa=hiku(arg1,arg2)
output=arg1.ToString()&" + "&arg2.ToString()&" = "&wa.ToString
Console.WriteLine(output)
output=arg1.ToString()&" - "&arg2.ToString()&" = "&sa.ToString
Console.WriteLine(output)
End Sub
End Module
LoadLibrary等はkernel32.dllの機能を使うので静的に読み込みます。自作DLLは動的に読み込みます。実行時にDLLを選ぶ場面って結構あるとおもうので。
、、、そして実行。
あれ?簡単に動いた、、、おかしいな、、、いろいろ謎のコツとかがあって、LoadLibraryとか失敗するんじゃないかと思ってたけど、、、いや、いいことなんですけど、、、
ところで、VSCodeでVBコードを作成するときに支援してくれる拡張機能ってないんかな。pythonでは出てくるとうざいんだけど、VBは慣れてないので出てきてほしい。身勝手。

コメントをお書きください