Отправляет email-рассылки с помощью сервиса Sendsay

1С и электронная коммерция

  Все выпуски  

1С и электронная коммерция Доступ к MD-файлам при помощи VBA




1С и электронная коммерция    Электронная газета сайта Системная интеграция + 1С

Пятница, 17 Декабря 2010 года (1917 год - В СССР церковь отделяется от школы.)

Внимание! Если хотите, чтобы мы посвятили рассылку Вам или вашему сайту, то пишите на почту: odin-s@bk.ru

Доступ к MD-файлам при помощи VBA

Файлы метаданных V7 (*.md) представляют собой структурированные хранилища (structured storage), организованные по правилам файловой системы от Microsoft. В терминологии OLE2 сами дисковые файлы носят название "составной файл" (compound file).

Compound file состоит из целого числа блоков данных, размер каждого блока равен 512 байт, т.е. соответствует одному дисковому сектору, поэтому в дальнейшем я буду пользоваться термином "сектор" для обозначения блока размером 512 байт.

Нумерация секторов в составном файле начинается с -1: -1,0,1,2…

В стуктуру составного файла входят следующие области данных:

  • заголовок файла;
  • данные, организованные в виде "больших блоков", занимающие целиком весь сектор;
  • данные, организованные в виде "малых блоков" размером по 64 байта, занимают весь сектор, но в количестве 8 штук;
  • данные, представляющие собой "объекты" каталога, размером по 128 байт, занимают весь сектор в количестве 4 штук;
  • таблица размещения в составном файле больших блоков, по сути это FAT (File Allocation Table), далее "FAT больших блоков";
  • таблица размещения собственно самого FAT больших блоков (может отсутствовать, если FAT вмещается в один сектор);
  • таблица размещения в составном файле малых блоков – FAT малых блоков;
  • неструктурированные данные (lock-bytes ???).
Прежде чем начать описание структуры и способов получения данных из составного файла, проведем некоторую подготовительную работу.

Нам придется работать с двоичными данными и переводить числа из шестнадцетеричного в десятичный формат (учитывая, что числа в файле хранятся в шестнадцатеричном формате начиная с младшего байта). Для этого в разделе деклараций нашего VBA-модуля создадим две UDT-структуры:

Public Type DWORD_C   'структура для чтения DWORD из файла
   b1 As Byte   '1 (младший байт)
   b2 As Byte   '2 байт
   b3 As Byte   '3 байт
   b4 As Byte   '4 (старший) байт
End Type

Public Type DWORD_B   'структура для перевода DWORD в LONG
   n As Long
End Type

и напишем функцию для перемещения содержимого из одной структуры в другую

Public Function HDec(vByte As DWORD_C) As Long
' функция преобразования знаковых длинных целых
Dim mLong As DWORD_B
   LSet mLong = vByte
   HDec = mLong.n
End Function

Объявим там же константу со значением размера сектора и байтовый массив, в котором будет хранится наш составной файл:

Public Const SECTORSIZE As Long = 512
Public fileBuf() as Byte

Далее пишем функцию, которая считает составной файл целиком в байтовый массив

Public Function GetFile() As Boolean
' прочитать файл
Dim iFile As Long ' номер файла
Dim lFile As Long ' размер файла
Dim rc As Boolean ' результат выполнения
Dim mdFileName as Strin ' полное имя файла

On Error Goto errHandler
rc = False ' результат выполнения

' здесь любым доступным способом присвоим переменной mdFileName имя
' составного файла
' . . .


If Len(mdFile) = 0 Then GoTo myExit
iFile = FreeFile()
Open mdFile For Binary As #iFile ' откроем файл в режиме двоичного доступа
lFile = LOF(iFile) ' размер файла
If lFile = 0 Then GoTo myExit

ReDim fileBuf(1 To lFile)
' считать весь файл
Get iFile, , fileBuf()
' закрыть файл
Close iFile
If UBound(fileBuf) = lFile Then
   ' если файл *.md считан правильно
   rc = True
End If

myExit:
   GetFile = rc
   Exit Function
errHandler:
   GetFile = rc
   ' . . . вывод сообщения об ошибке
End Function

Если функция вернула True, значит файл считан в массив fileBuf().

Заголовок составного файла

Заголовок представляет собой запись размером 80 байтов в секторе номер -1. Нас будут интересовать следующие поля заголовка:

Смещение Размер поля Описание
Dec Hex
+1 +00h DWORD Магическое число E011CFD0h (-535703600 при выполнении функции HDec)
+45 +2Ch DWORD Количество секторов, которые занимает FAT больших блоков
+49 +30h DWORD Номер стартового сектора каталога
+61 +3Ch DWORD Номера стартового сектора FAT малых блоков
+69 +44h DWORD Номер сектора доп.таблицы размещения FAT больших блоков
+77 +4Ch DWORD Номер стартового сектора FAT больших блоков

Что сие означает – будет рассказано ниже, а пока что в разделе деклараций модуля создаем UDT структуру:

Public Type FILEHEADER ' это структура для заголовка файла
   SizeOfBBD As Long ' кол-во секторов FAT больших блоков
   StartBBD As Long ' стартовый сектор FAT больших блоков
   StartBBDex As Long ' стартовый сектор доп.таблицы для FAT больших блоков
   StartSBD As Long ' стартовый сектор FAT малых блоков
   StartRoot As Long ' стартовый сектор каталога
End Type

объявляем переменную, которая будет содержать означенную выше структуру

Public HeaderMD As FILEHEADER

и пишем функцию, которая заполнит стуктуру заголовка составного файла

Public Function GetHeader() As Boolean
' прочитать заголовок файла
Dim i As Long
Dim sText As String
Dim dWord As DWORD_C
Dim x As Long
Dim rc As Boolean

On Error Goto errHandler
rc = False ' результат выполнения

' сектор, в котором расположен заголовок,
' нумеруется как (-1), поэтому для оптимизации
' сразу прибавляем по 1 к стартовым значениям
' т.к. сами считать будем от головы файла

' сигнатура файла

dWord.b1 = fileBuf(1)
dWord.b2 = fileBuf(2)
dWord.b3 = fileBuf(3)
dWord.b4 = fileBuf(4)
sText = Hex(HDec(dWord))
' проверяем на наличие магического числа
If sText <> "E011CFD0" Then
   GoTo myExit
End If
' количество секторов в FAT больших блоков
i = &H2C
dWord.b1 = fileBuf(i + 1)
dWord.b2 = fileBuf(i + 2)
dWord.b3 = fileBuf(i + 3)
dWord.b4 = fileBuf(i + 4)
HeaderMD.SizeOfBBD = HDec(dWord)
' стартовый сектор каталога
i = &H30
dWord.b1 = fileBuf(i + 1)
dWord.b2 = fileBuf(i + 2)
dWord.b3 = fileBuf(i + 3)
dWord.b4 = fileBuf(i + 4)
HeaderMD.StartRoot = HDec(dWord) ' здесь порядковый номер сектора
' стартовый сектор FAT малых блоков

i = &H3C
dWord.b1 = fileBuf(i + 1)
dWord.b2 = fileBuf(i + 2)
dWord.b3 = fileBuf(i + 3)
dWord.b4 = fileBuf(i + 4)
HeaderMD.StartSBD = HDec(dWord)
' стартовый сектор таблицы размещения доп.FAT больших блоков
i = &H44
dWord.b1 = fileBuf(i + 1)
dWord.b2 = fileBuf(i + 2)
dWord.b3 = fileBuf(i + 3)
dWord.b4 = fileBuf(i + 4)
x = HDec(dWord)
If x > 0 Then
   ' вычислить абсолютный адрес только если он больше 0
   x = 1 + (x + 1) * SECTORSIZE
End If
HeaderMD.StartBBDex = x
' стартовый сектор FAT больших блоков
i = &H4C
dWord.b1 = fileBuf(i + 1)
dWord.b2 = fileBuf(i + 2)
dWord.b3 = fileBuf(i + 3)
dWord.b4 = fileBuf(i + 4)

' вычисляем абсолютный адрес в файле
HeaderMD.StartBBD = 1 + (HDec(dWord) + 1) * SECTORSIZE
rc = True

myExit:
   GetHeader = rc
   Exit Function
errHandler:
   GetHeader = rc
   ' . . . вывод сообщения об ошибке
End Function

Если функция вернула True, значит заголовок считан и наш файл является составным файлом OLE.

Автор: Сергей Новодворский


Новые темы форума для обсуждения

1C и электронная коммерция
  Тема Ответы Просмотры Автор темы Обновления
Коэффициент-дифлятор для декларации по ЕНВД 0 1 audignduB Сегодня, 19:09
Сообщение от: audignduB
Бухгалтерия предприятия 0 2003 NightBeast 29.05.2009, 18:17
Сообщение от: NightBeast

«Новости, новинки и обзоры серверной и компьютерной техники для дома и другая информация наших друзей. Скидки и подарки»:

  • «Экскурсия - прогулка по храму Новый Иерусалим всего в 1 часе от Москвы»
    На прогулке Вас будет сопровождать гид - преподаватель, водивший экскурсиию по монастырю Новый Иерусалим более 5 лет, а также объездивший пол мира, ранее трудившийся в одной из башен монастыря и помогавший реставрации храма - интересный гид и собеседник, любящий город, храм и окружающую природу. Автор знаменитой 4 часовой экскурсии по монастырю
    На этой экскурсии-прогулке Вы побываете в городе Истра и с полноценным рассказом о монастыре Новый Иерусалим.
    Первая остановка будет у памятника А. П. Чехову около Педагогического училища с рассказом о жизни писателя в городе Истра. Рассказ об уникальных раскопках на Сионском холме, где стоит монастырь и о происхождении названия города, связанного напрямую со Святейшим Патриархом Никоном от первого села Сафатова до современного названия города. Повествование проведет с 900 года от Рождества Христова до 30 годов XX века.
    Минуя яблоневый сад, попадете в центр города к фонтану, к довоенным зданиям Универмага и Купеческого дома. Повествование затронет военные годы города и монастыря. Об оккупации города немцами, которые пробыли тут две недели, о взрыве монастыря при отступленнии и послевоенном его восстановлении. Далее по пути пилонам (столбам) от дома А. П. Чехова 1883 года будет рассказ о достопремечательностях города и района у стенда городской администрации. Рассказ об основных сооружениях монастыря - ротонде гроба Господня, внутри которой находится Кувуклия - пещера символизирующая место, где был похоронен Иисус, где он воскрес и где происходит схождение Благодатного огня в Иерусалиме, о Воскресенском соборе, где находится Голгофа, камень миропомазания, Судные и Красные врата монастыря.
    Очередная остановка будет у поклонного креста на горе Елеон, с рассказом о жизни святейшего Патриарха Никона, о приделах Новоиерусалимского монастыря: в Успенском приделе (находятся мощи св. мученицы Татианы и святыня крест - мощевик, подаренный монастырю иерусалимскими монахами. Крест содержит частицы Креста Господня и мощей святых, включая евангелиста Марка); в Архангельском приделе - список Тихвинской чудотворной иконы Божией матери XVII века, гробница патриарха Никона в Предтеченском приделе, возле которой происходят чудесные исцеления; в действующей подземной церкви Константина и Елены с уникальным медным иконостасом (находится кладезь "Живоносный источник").
    Далее минуя красивый городской парк выйдете к уникальному памятнику самолету ИЛ-2. Затем через красивую тропинку вдоль реки, по красивейшей липовой аллее пойдете к монастырю Новый Иерусалим.
    Очередная остановка около крепостной стены монастыря с видом на поле, где произошло знаменитое сражение Правительственных войск Петра I и стрельцов в 1698 году с рассказом о сражении, подземных ходах монастыря, крепостной стене и ее особенностях, о 7 сторожевых башнях монастыря и 2 надвратных, о трех святых источниках, о ските Патриарха Никона (Богоявленской пустыни), о реке Иордан (Истра) с ее купелью с рассказом о чудесных исцелениях. Также о парке Гефсиманский сад, Кедронском потоке и о том, что там можно увидеть.
    Вдоль крепостной стены выйдете к скиту, за которым можно будет увидеть реку Истру (Иордан), купель, а затем мимо Силоамского источника зайдете в монастырь, где можете в сопровождении гида или самостоятельно осмотреть монастырь.
  • «Анонсирование профессиональных графических станций для многоэкранной визуализации с использованием решений NVIDIA Quadro Plex»
    Компания STSS объявляет о начале производства и продаж профессиональных графических станций для многоэкранной визуализации с использованием графических решений NVIDIA Quadro Plex. NVIDIA Quadro Badge Графические станции STSS Flagman для масштабируемой визуализации на основе NVIDIA Quadro Plex способны отображать 36-мегапиксельные изображения на экранах высокого разрешения, 4K дисплеях или проекторах, предлагая простое и экономичное высокопроизводительное визуальное решение для многоэкранной конфигурации с количеством дисплеев от 1 до 8. Благодаря масштабируемым решениям для визуализации STSS Flagman на основе Quadro Plex, любое приложение может быть бесшовно масштабировано на несколько экранов, с дополнительной возможностью визуализации иммерсивного стерео 3D...

    Читать далее на http://www.stss.ru >>>

  • «CHANEL 4084»
    Легендарные очки от легендарной марки.Хит модных показов. Очки совершенно новые. Полный фирменный пакет,коробочка,фирменный футляр,салфетка,документы. На обоих линзах стоит фирменная гравировка CHANEL,а также уникальный серийный номер(защита от подделок). Материал линз - пластик (G15) с упрочняющим покрытием. Оправа полимерная(пластиковая)...

    Читать далее на http://margalit.ru >>>


Вы можете добавить свою новость или статью по адресу (необходимо зарегистрироваться): stss.3dn.ru
По вопросам размещения Ваших статей и информации в наших рассылках - пишите нам: odin-s@bk.ru
Вы можете добавить свою новость или статью в наше сообщество по адресу: http://my.mail.ru/community/1c-e-commerc/
Давайте поможем инвалидам, ветеранам и детям! Информация здесь >>>
Рассылки Subscribe.Ru
Освещение для интерьеров и парков
Техника для создания любимой погоды в доме, от кондиционера до тепловой пушки
Автономные электростанции для загородного дома и все, что можно к ним подключить
Техника в помощь садоводу и фермеру
Все о насосах для любых водоемов и водонагревателях
Моечная и уборочная техника для быта и производства
Рукопашный бой для девушек -- выживание, психология!
Серверы, сетевое оборудование, тесты, характеристики, советы
Милосердие. Чем ты можешь помочь ближнему.
Православные знакомства
Православные книги, фильмы, программы и другие издания
Агробизнес и советы садоводам
Здоровый образ жизни
Фотосъемка природы и людей на природе и в интерьере
Рецепты кухни народов СССР
Скидки, подарки, призы...
Очки, оптика, одежда, обувь и аксессуары. Новинки и обзоры
Секреты рекламы и создания интернет-магазинов
1С и электронная коммерция

В избранное