Форум программистов, компьютерный форум, киберфорум
bedvit
Войти
Регистрация
Восстановить пароль

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

Запись от bedvit размещена 28.01.2026 в 12:35. Обновил(-а) bedvit 28.01.2026 в 12:43
Показов 2165 Комментарии 0
Метки com, vb, winapi

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

Нажмите на изображение для увеличения
Название: VariantToFromFile.PNG
Просмотров: 95
Размер:	89.3 Кб
ID:	11456

Функционал:
+ Сохранять данные из 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) или здесь (для других программ).
Метки com, vb, winapi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru