Optimistic76 Ответов: 2

Выпуск библиотеки DLL C++, вызванной из excel VBA


Всем привет,

Я успешно вызываю функцию dll, написанную на c++, из макроса, созданного в EXCEL VBA.

функция вызывается с помощью оператора Declare:

Private Declare PtrSafe Function FourierSerieCoeffs Lib "D:\OutBin\ISLib.dll" (ByVal T As Double, ByVal n As Long, ByVal nEq As Long, ByRef x As Double, ByRef fx As Double, ByRef outC As Double) As Long


После первого выполнения макроса я не могу перестроить библиотеку dll, потому что кажется, что Excel все еще использует ее.

Единственный способ перестроить dll проект с открытым файлом excel это добавить в конце макроса следующие строки:

hMod = GetModuleHandle("ISLib.dll")
Do Until FreeLibrary(hMod) = 0
   
Loop


с помощью этих строк я могу скомпилировать проект c++, но если я выполню его снова, то макрос excel выйдет из строя.

Любое предложение выпустить dll без сбоя excel в следующих исполнениях?

Спасибо

Что я уже пробовал:

I tried calling the library again with LoadLibrary at the beginning of the macro but it doesn't work.

2 Ответов

Рейтинг:
20

Jochen Arndt

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

Когда вы не закрываете Excel и не перезапускаете макрос, он не обязательно компилируется полностью снова (сгенерированный байт-код все еще находится в памяти и выполняется).

Чтобы проверить это, отредактируйте источник макроса или выберите "скомпилировать" в меню отладки редактора VBA после обновления библиотеки DLL, чтобы убедиться, что она скомпилирована.

В старых версиях Office существовала опция "компиляция по требованию", которая также может обеспечить повторную компиляцию при выключении.


Optimistic76

что ж, ваше предложение поможет мне глубже заглянуть в параметры excel!
Наконец-то я обнаружил, что если включить режим дизайна, то все работает нормально!!!
так что спасибо!

Jochen Arndt

Прекрасно, что она решена, и спасибо Вам за ваши отзывы.

Просто из интереса:
Можно ли также не освобождать библиотеку в режиме проектирования?

Я предполагаю, что в режиме проектирования код всегда перекомпилируется (и библиотеки могут быть выгружены).

Optimistic76

извините за задержку,
нет никакой необходимости освобождать библиотеку.
После выполнения макроса режим проектирования автоматически отключается, и мне нужно установить его снова, чтобы скомпилировать библиотеку dll c++

Jochen Arndt

Никаких проблем с задержкой.

Это просто полезно для других, посещающих эту тему.

Поскольку он используется только во время разработки, активация режима проектирования после обновления библиотеки DLL должна быть приемлемой.

Рейтинг:
1

Optimistic76

Поверьте мне Graeme_Grant, я пробовал решения, которые нашел в google, но никто, кажется, не работает!

Graeme_Grant

Я быстро просмотрел ссылки, подтвержденные в приведенном выше поиске, и они выглядят хорошо.