|
■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
|