C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■103475 / )  Re[3]: VBAから扱えるDLLの作成
□投稿者/ あずさ2号 (2回)-(2024/12/11(Wed) 10:51:59)
No103474 (くま さん) に返信
くまさん、色々とアドバイスありがとうございます。
そうします。
確かに、公開となると、よく理解していないだけに、すくんでしまします。
私としては、登録等などOSに手をかけない方法がいいでんすが・・・
例えば、作成したDLLをEXCELとセットでカレントに格納されてれば動作するよう
環境でしょうか。
そこで、検索中で、マクロからDLLをロードし、処理するサイトがありました。


一つ気になることがあります。
EXCElが32ビットなら、DLLも32ビットであることとネットで見たような気がします。
作成したDLL自体が、どちらなのか、新たな問題が発生しそうです。

本題に戻り、テストコードを作成しましたが、うまくいかない箇所がありますので、
そちらの方向で、皆さんアドバイスいただけないでしょうか?
宜しくお願い致します。
参考にしたURL
https://liclog.net/vba-dll-create-5/#google_vignette
https://excel.syogyoumujou.com/memorandum/dll_1.html  ←前質問で記載済みのURL
以下に、
クラスのコード-----------------------------------
ビルドしエラーは無く、Dllが作成されました。DLL名:ClassLibrary1.dll
Public Class Class1
Public Function Add(ByVal num1 As Integer)
Return num1 + 10
End Function

Public Function Hallo(ByVal sName As String)
Return sName & "sasaki"
End Function
End Class

以下、EXCELのVBAマクロ-----------------------------------
'動的にDLLを取得するためのWinAPI
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, ByVal lpProcName As String) As LongPtr
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As LongPtr) As Long
'DLLファイルの関数定義
Private Declare PtrSafe Function Hello Lib "ClassLibrary1.dll" (ByVal sName As String) As String

Public Sub maintest()
Dim hDll As LongPtr
Dim hProc1 As LongPtr
Dim hProc2 As LongPtr
Dim sFolderPath As String
Dim iFileSize As Long
Dim sFilePath As String

'DLLファイルを保存するフォルダパスを設定
sFolderPath = ThisWorkbook.Path

'DLLファイルを読み込む
hDll = LoadLibrary(sFolderPath & "\" & "ClassLibrary1.dll") '"DLLファイルフルパス

'DLLファイルの指定関数のアドレス取得
hProc1 = GetProcAddress(hDll, "Add")  'ここでエラーとなり取得出来ない、値=0
hProc2 = GetProcAddress(hDll, "Hallo") 'Halloで試みるが同じ結果 
If hProc1 = 0 Then
Call MsgBox("DLLファイルの読み込みに失敗しました")
Call FreeLibrary(hDll)
Exit Sub
End If

 Console.WriteLine (Class1.Add(20)) '30
'DLL解放
Call FreeLibrary(hDll)
End Sub


返信 編集キー/


管理者用

- Child Tree -