Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12

VB - Excel. Работа с классом в DLL

20.02.2019, 21:13. Показов 672. Ответов 7

Студворк — интернет-сервис помощи студентам
Доброго дня, гуру форума.

Есть два вопроса, которые не могу решить. Очень надеюсь на вашу помощь:
Excel 2007.
1. При открытии книги обращаюсь к dll (написана на VB6). Dll отрабатывает верно, но спустя несколько минут Excel виснет.
Если не объявляю и не обращаюсь к классу внутри Dll, то всё работает без зависаний.
Пробовал комментировать все действия в классе, оставляя только его объявление. Итог один - отрабатывает и, спустя некоторое время, виснет.
Проблема точно с классом, с его объявлением. У меня идеи уже закончились. Код ниже.
2. Как можно в Excel вернуть значение переменной, которая формируется внутри класса dll? В моём примере это, скажем, MACs.Status_MAC.
Прошу Вашей помощи.

Код в Excel
Visual Basic
1
2
3
4
5
6
Public Declare Function GetMACAddrrDLL Lib "C:\FLOPDLL\FLOP.dll" () As Boolean
Public Sub workbook_open()
...
    GetMACAddrrDLL
...
End Sub
DLL. Модуль процедуры работы с классом
Visual Basic
1
2
3
4
5
6
7
8
9
Public objExcel As Object
Public MAC_MIN As Integer
Public Function GetMACAddrrDLL() As Boolean
Dim i, j, k As Integer
Dim MACs As MAC_Class
    Set MACs = New MAC_Class
    MACs.MAC_Status_Get
...
End Function
DLL. Модуль класса
Visual Basic
1
2
3
4
5
6
7
8
9
10
Public MAC_Status As Integer
Public Function MAC_Status_Get() As Boolean
...
    MAC_Status = 1
...
End Function
 
Public Property Get Status_MAC() As Integer
    Status_MAC = MAC_Status
End Property
Заранее благодарю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2019, 21:13
Ответы с готовыми решениями:

Разработка приложения: работа с классом из DLL
Помогите, пожалуйста, написать программу

Некорректная работа с Microsoft.office.interop.excel.dll на других ПК
Всем добра! Понимаю, тема уже избита и много раз обсуждалась, но все же хотелось уточнить раз и навсегда На рабочей станции стоит ...

Создать dll с классом
Имеется класс(хедер файл) #ifndef RECTANGLE_H #define RECTANGLE_H #include "d:\my_programs\OOP\2\1\paint.h" namespace myFigures...

7
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.02.2019, 21:27
Как написана DLL? Просто так нельзя экспортировать функции, нужно инициализировать рантайм.

Цитата Сообщение от Плотник Посмотреть сообщение
Как можно в Excel вернуть значение переменной, которая формируется внутри класса dll? В моём примере это, скажем, MACs.Status_MAC.
Создать публичный объект из класса и получить значение этой переменной через его Property.
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
20.02.2019, 21:46  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Как написана DLL? Просто так нельзя экспортировать функции, нужно инициализировать рантайм.
На базе Вашей NativeDLL
https://www.cyberforum.ru/blog... g2792.html
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.02.2019, 21:51
Цитата Сообщение от Плотник Посмотреть сообщение
На базе Вашей NativeDLL
Ну первое что бросается в глаза что объект MAC_Class живет только внутри функции GetMACAddrrDLL, а обращение, возможно, идет в другом месте. Не видя код класса, нельзя что-то предложить, также корректно ли установленя опция ThreadingModel?
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
20.02.2019, 22:25  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
объект MAC_Class живет только внутри функции GetMACAddrrDLL
все в GetMACAddrrDLL и начинается, и заканчивается.
Цитата Сообщение от The trick Посмотреть сообщение
Не видя код класса
Практически весь код написан сверху. Подчеркну, что, удаляя "..." и оставив только объявление класса, итог не меняется - через несколько минут Excel зависает.
Цитата Сообщение от The trick Посмотреть сообщение
корректно ли установленя опция ThreadingModel?
Сейчас Single Threaded. С многопоточностью пока вопросы не решал.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.02.2019, 22:31
Также я вижу глобальную переменную objExcel. Есть уверенность что библиотека выгружается когда переменная содержит ссылку на объект.
При создании Native Dll на VB есть очень много неочевидных моментов. Проще просто играть по правилам COM и создавать объект стандартными средствами. В общем нужно обеспечить инициализацию рантайма при работе с DLL и деинициализацию при выходе. Этим занимается стандартный механизм VB, он при создании объекта инициализирует рантайм, а при уничтожении всех созданных объектов деинициализирует его. Если нужно обеспечить работу экспортируемых функций то необходимо создать такой публичный объект и дальше просто работать с экспортом. При уничтожении объекта либа деинициализируется сама. В противном случае мы не знаем когда деинициализировать рантайм. Делать это в DllMain не совсем корректно, т.к. на каждый "чих" мы инициализируем рантайм, а вот деинициализация может не пройти т.к. для деинициализации необходимо выполнить ряд мер в контексте потока в котором рантайм инициализирован, что не всегда возможно. К примеру мы можем инициализировать 5 контекстов при получении 5 DLL_THREAD_ATTACH, а вот как их деинициализировать если мы получаем DLL_PROCESS_DETACH? Ответ - никак. Поэтому нужно либо учитывать этот факт и производить инициализацию при необходимости, т.е. либо вызывать перед началом работы какую-либо специальную функцию для инициализации и в конце функцию деинициализации. Но вопрос, чем стандартные функции DllGetClassObject / DllCanUnloadNow не подходят?
Я как-то начинал делать специальный модуль чтобы делать DLL из EXE, но столкнувшись с этими ограничениями - забросил. Видимо и Хакер поэтому забросил fndll. Просто в этом смысла нет. Кто знает об этих ограничениях - напишет Dll как нужно.
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
20.02.2019, 22:41  [ТС]
Вектор размышлений понятен. Буду пробовать копать дальше. Спасибо.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.02.2019, 22:41
Цитата Сообщение от Плотник Посмотреть сообщение
Практически весь код написан сверху. Подчеркну, что, удаляя "..." и оставив только объявление класса, итог не меняется - через несколько минут Excel зависает.
Если у тебя одна функция GetMACAddrrDLL просто инициализируй в ней рантайм, и при выходе деинициализируй. DllMain вообще оставь стандартную. Так даже правильней, поскольку функция тогда сможет вызываться из разных потоков (при Apartment Threading).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2019, 22:41
Помогаю со студенческими работами здесь

Ошибка в dll с классом AnsiString
Возникла такая проблема: при использовании во внутренних функциях dll типа AnsiString возникают различные Linker Error-ы, например...

.EXE и .DLL (ошибка LNK2019 с шаблонным классом)
У меня есть два проекта - первый это dll-проект, и второй это exe-проект. Мне нужно использовать шаблонный класс из .dll, в моем главном...

Создать DLL с сервисным классом ServiceSort<T> с методами SortMax и SortMin
Создайте DLL с сервисным классом ServiceSort&lt;T&gt;, включающим методы сортировки SortMin, SortMax для массивов с произвольным типом элементов...

Где взять dll с классом (для дальнейшей регистрации этого класса)?
Есть программка на C#, при работе с файлом *.xlsx выдаётся такая ошибка: Пришлось штутдировать Добрынина и Роджерсона. В них...

Разработать и реализовать DLL-модуль с классом, позволяющим запускать внешнюю программу
Добрый день. Есть такая задача: Разработать и реализовать на платформе Microsoft .NET (используя язык программирования C#, VB.NET или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru