2013-04-06 4 views
1

В настоящее время я работаю над проектом с использованием C++ и Excel. Я создал DLL для экспорта функции C++ в Excel. Моя проблема в том, что когда я тестирую свою функцию в Excel, и я хочу изменить свою DLL, мне нужно выйти из Excel, потому что она все еще работает с DLL-файлом, а Visual Studio C++ не может удалить предыдущую DLL, чтобы сделать другую.Закрыть доступ к dll в Excel

Это немного раздражает, чтобы закрыть и снова запустить Excel каждый раз, поэтому я хотел бы знать, есть ли способ закрыть доступ к Dll, когда скрипт VBA закончен.

Спасибо!

+0

Я довольно уверен, что там не так много вариант, так как DLL загружается сам Excel. –

+0

Вы пытались добавить/удалить ссылку в начале или конце вашего сценария VBA? – Mike

+0

Если вы наберете «End» в окне VBA Immediate, то это должно сделать это. Вы также можете поместить «End» в конец вашего скрипта VBA, который иногда выгружает DLL, но не всегда я нахожу. –

ответ

0

Один метод, который вы могли бы использовать, чтобы запустить отдельный экземпляр первенствовать и автоматизировать открытие/закрытие первенствует как так ... (это псевдокод я ввел его в браузере)

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 

Второй метод будет динамически загружать и выгружать 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 
+0

Это позволило мне удалить DLL, но когда я заменил его на измененную DLL, тогда Excel разбился ... любая идея почему? –

0

Альтернативный подход, который позволяет автоматизировать Excel открыть/закрыть, чтобы использовать возможности вашего IDE (если он имеет их), чтобы сделать это для вас.

Например, CVF, IVF и CodeBlocks предоставляют средства для запуска Excel и запуска вашего addin/dll (и отладки в реальном времени).

В качестве примера, в CodeBlocks перейдите к аргументам Project/Set Program .... Это запустит диалог. Вы помещаете свой файл xls в полный путь в Аргументы программы (например, C: \ myexceltest.xls), и вы помещаете paht в Excel в поле Host Application (например, D: \ Apps \ MSO \ Office10 \ EXCEL.EXE ... или где находится ваш Excel.EXE).

Затем просто запустите или отлаживайте, и он работает автоматически. Вы не можете изменить DLL во время ее запуска, но закрытие Excel либо явно, либо из IDE, вернитесь к исходному коду, внесите изменения и просто нажмите «Выполнить» или что-то еще в вашей среде IDE, а ваш дядя Excel и ваш .xls запуск автоматически.

Если вы установили контрольные точки в своем источнике, то запуск Debug в вашей среде IDE позволит вам отлаживать вашу DLL в реальном времени.

Это должно относиться к любому языку (например, это работает с Fortran библиотек и т.д.)

Смежные вопросы