3

現在、C++ と Excel を使用するプロジェクトに取り組んでいます。C++ 関数を Excel にエクスポートする DLL を作成しました。私の問題は、Excel で関数をテストし、DLL を変更したい場合、.dll ファイルがまだ実行されているため、Excel を終了する必要があり、Visual Studio C++ は以前の DLL を削除して別の DLL を作成できないことです。

毎回 Excel を閉じて再起動するのは少し面倒なので、VBA スクリプトが終了したときに Dll へのアクセスを閉じる方法があれば教えてください。

ありがとう!

4

2 に答える 2

0

使用できる1つの方法は、別のExcelインスタンスを実行し、Excelの開閉を自動化することです...(これはブラウザに入力した擬似コードです)

Sub TestMyDll()
  Dim xl as New Excel.Application
  xl.Workbooks.Open "file"
  xl.Run "MyFunctionCall"
  xl.Workbooks(1).Close False
  xl.Quit
  Set xl = Nothing
End Sub

2 つ目の方法は、dll を動的にロードおよびアンロードすることです。これはおそらく私が使用する方法です。テストとして、Winhttp.dll を別のディレクトリにコピーし、my.dll と名付けました。コードを含むワークブックと同じディレクトリに dll を配置しないでください。そうしないと、Excel が dll をロードする可能性があります。

Option Explicit

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

'my.dll is a copy of Winhttp.dll in a directory other than where this workbook is saved.
'Calling this will result in an error unless you call LoadLibrary first
Private Declare Function WinHttpCheckPlatform Lib "my.dll" () As Long

Private Sub Foo()
    Dim lb As Long

    lb = LoadLibrary("C:\Users\David\Downloads\my.dll")

    MsgBox WinHttpCheckPlatform

    'I found I had to do repeated calls to FreeLibrary to force the reference count
    'to zero so the dll would be unloaded.
    Do Until FreeLibrary(lb) = 0
    Loop
End Sub
于 2013-04-06T15:19:26.023 に答える