Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,140
Записей в блоге: 22

Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT

01.03.2026, 22:11. Показов 313. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы исходники Crypto++
Использованы алгоритмы сжатия WinApi.



Функционал:
+ Сохранять данные из VARIANT в файл
+ Загружать данные из файла в VARIANT
+ Шифровать данные при сохранении
+ Сжимать/архивировать данные при сохранении
+ Обрабатывать любое количество вложений в массивах (дерево)
+ Реализован механизм (shared string table), как в Excel, для оптимизации размера одинаковых строк при сохранении в файл


Особенности:
! Алгоритмы компрессии compressapi.h WinApi. поддерживаются начина с Windows 8 (Minimum supported client Windows 8).
+ Поддерживаются базовые типы и массивы любой вложенности (только одномерные или двухмерный массивы). Объекты не сериализуются.
+ Ссылочный тип VARIANT (VT_VARIANT | VT_BYREF) преобразуется в VARIANT при записи в файл.
+ Пустая строка записывается в файл и читается из файла с NULL указателем в VARIANT (важная особенность BSTR заключается в том, что BSTR со значением NULL (или nullptr ) эквивалентен пустой строке . Другими словами, пустая строка "" и BSTR со значением NULL должны иметь одинаковую семантику).
+ Поддерживает длинные пути к файлам
+ Пароль хранится только во время выполнения в CryptProtectMemory, при выполнении функции данные в CryptProtectMemory и параметре password затираются SecureZeroMemory, т.е. информация о пароле стирается и далее его знает только пользователь, т.е. способа узнать забытый пароль не существует.
+ Тип данных и алгоритм шифрования запоминается при сохранении в файле, и их нужно указывать только при сохранении в параметрах или в форме. При чтении файла нужен только пароль.
+ Данные в файле хранятся в бинарном виде
+ Поддержка 2х режимов: интерактивного и не интерактивного. Если вторым аргументом функции передаем пустую строку (полный путь к файлу) - работаем в интерактивном режиме (открываем форму, выводим ошибки в диалоге)


Функция сохранение в файл:
VARIANT* resultRetval = VariantToFile(VARIANT* variantIn, BSTR fileName, BSTR fileNameDefault, BSTR password, LONG algorithmCrypto, LONG algorithmCompress, LONGLONG hWndParent)


Параметры функции:
1. variantIn - данные в виде VARIANT для сохранения
2. fileName - полный путь к файлу (если пустой - интерактивный режим)
3. fileNameDefault - полный путь по умолчанию (открыть форму сохранения в этой папке с этим файлом в строке сохранения) , (не обязательный, по умолчанию: "")
4. password - пароль (не обязательный, по умолчанию: "")
5. algorithmCrypto - алгоритмы шифрования AES (не обязательный, по умолчанию: 1):
1 - "Без шифрования"
2 - "AES256:ECB"
3 - "AES256:CBC"
4 - "AES256:OFB"
5 - "AES256:CFB"
6 - "AES256:CBC-CTS"
7 - "AES256:CTR"
6. algorithmCompress - алгоритмы сжатия (не обязательный, по умолчанию: 4)::
1 - "Без сжатия"
2 - "WinAPI:MSZIP"
3 - "WinAPI:XPRESS"
4 - "WinAPI:XPRESS_HUFF*"
5 - "WinAPI:LZMS"
7. hWndParent - HWND окна родителя (не обязательный, по умолчанию: 0):.


Возвращаемые значения:
resultRetval = S_OK(0): Успех
resultRetval = ERROR_CANCELLED(1223): Операция была отменена пользователем.
Остальные ошибки выбрасываются исключениями.



Функция загрузки из файла::
VARIANT* resultRetval = VariantFromFile(VARIANT* variantOut, BSTR fileName, BSTR fileNameBasic, BSTR password, LONGLONG hWndParent)
Параметры функции:
1. variantOut - переменная VARIANT для получения данных из файла
2. fileName - полный путь к файлу (если пустой - интерактивный режим)
3. fileNameBasic - полный путь по умолчанию (открыть форму загрузки в этой папке с этим файлом в строке сохранения) , (не обязательный, по умолчанию: "")
4. password - пароль (не обязательный, по умолчанию: "")
5. hWndParent - HWND окна родителя (не обязательный, по умолчанию: 0)


Возвращаемые значения:
resultRetval = S_OK(0): Успех
resultRetval = ERROR_CANCELLED(1223): Операция была отменена пользователем.
resultRetval = ERROR_USER_PROFILE_LOAD(500): Пользовательские данные из файла не удалось загрузить, создан новый файл (когда пути к fileName и fileNameBasic совпадают и файл с ошибкой). В интерактивном режиме выводятся имена созданного файла и файла отмеченного как ошибочного.
resultRetval = NTE_BAD_KEYSET(2148073494): Часть ключей не загрузилась из файла. В интерактивном режиме выводится список.
Остальные ошибки выбрасываются исключениями.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
 
Sub Test_VariantToFromFile()
 
    Dim listViewSave, listViewLoad, resultVtoF, resultVfromF, aray2D
    Dim aray2DHeader: ReDim aray2DHeader(1 To 2, 1 To 2)
    Dim aray2DData: ReDim aray2DData(1 To 2, 1 To 3)
    Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA") 'позднее связывание
    
    'сохраним массив и описания к нему (дерево свойств объекта)
    listViewSave = Array("ListView309" _
                , Array("Header" _
                        , aray2DHeader) _
                , Array(Array("Data", Array(1, 2)) _
                        , aray2DData) _
                , Array("Width" _
                        , Array(150, , 160)) _
                , Array("ComboBox" _
                    , Array(Array(, 111), , Array(222)) _
                    , Array(111, Array("", "(", "((", "(((", "((((", "(((((")) _
                    , Array(222, Array("", ")", "))", ")))", "))))", ")))))")) _
                    ) _
                , Array("RC" _
                    , Array(Array(196, 197), , 198) _
                    , Array(197, "строка-бинарные данные ресурса") _
                    ) _
                )
    
    'сохраняем в файл
    'если вторым аргументом передаем пустую строку(полный путь к файлу) - работаем в интерактивном режиме (открываем форму)
    resultVtoF = bVBA.VariantToFile(listViewSave, "")
    If resultVtoF = 1223 Then Exit Sub 'отменено пользователем
    
    'загружаем из файла
    'если вторым аргументом передаем пустую строку(полный путь к файлу) - работаем в интерактивном режиме (открываем форму)
    resultVfromF = bVBA.VariantFromFile(listViewLoad, "")
    If resultVtoF = 1223 Then Exit Sub 'отменено пользователем
 
End Sub

Библиотеки бесплатные, скачать можно здесь (для Excel) или здесь (для других программ).

Блог по теме.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2026, 22:11
Ответы с готовыми решениями:

Автоконвертирование типов данных в массиве variant
Создается массив Variant, в который записывается куча данных разного типа, в том числе числа с...

Потеря данных при переводе Date -> Variant -> Date
Здравствуйте. В моём файле Excel есть столбец с данными типа Дата (формат - "yyyy-mm-dd"). Мне...

Код работает только с типом данных Variant
Небольшая задачка для определения, лежит ли точка с координатами x y в выделенной плоскости, но...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2026, 22:11
Помогаю со студенческими работами здесь

Как удалить variant
Пробую себя в VBA. До VBA изучал C# с автоматической сборкой мусора. Поэтому, вопрос такой - как...

Как переводится "Returns a Variant"
Например, как переводится слово Variant в этой строке (строка из Справки по VBA): Returns a...

Что означает Variant (для перевода на другой ЯП)
Есть следующий код: Dim OriginArray(1 To 3) As Variant Dim Origin(1 To 2) As Double '. . . ....

Переполнение при перемножении чисел типа Variant
Вот так работает: Dim TotF As Long TotF = 15000000 А вот так выдаёт "переполнение": Dim TotF...

Тип Variant, если пусто, как написать условие
Привет=) Есть у меня переменная типа Variant, если в ней ничего нету должно проходить некоторое...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru