Переменный размер ресурса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Переменный размер ресурса

Сообщение GSerg » 20.01.2004 (Вт) 10:25

:shock:
Баловался с шифрованием. Написал маленькую прогу, которая шифрует притащенный(е) на форму файл(ы) и потом засовывает их в ресурсы при помощи rc.exe. Потом остаётся только прилинковать ресурс к проге, которая умеет его читать.
Возрадовавшись, что всё работает, скомпилировал читающую прогу (до этого только из IDE пускал). Читаю ресурс. На выходе редкостный гон. Запускаю из IDE - нормально. Догадался всё-таки вставить msgbox ubound, оказалось, что по сравнению с IDE размер ресурса (тип "CUSTOM") увеличился на 2 байта, и всё шифрование поплыло. Пришлось писать redim preserve ubound-2, скомпилировал - экзешник работает отлично, из IDE, естественно, нет.
Спрашивается, во-первых, какого? Ну и во-вторых, какого? же. Есть правило какое-то, что ли, что размеер кастомарного бинарного ресурса выравнивается (по какой границе?). И вообще что за ерунда...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 20.01.2004 (Вт) 19:53

Все дело в особенностях гранулярности при распределении памяти. Она является числом кратным 64 (при использовании процессоров x86). По нему выравнивается объем выделяемой памяти для ресуросов (кроме того он еще и всегда кратен объему системной страницы, т.е. 4).

Вывод:
к ресурсу с размеров, например 597 байт будет добавлено необходимое кло-во пробелов что бы он стал размером 600 байт (т.е. был кратен 4)

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 21.01.2004 (Ср) 7:43

2xolod: почти так... дело в разнице между внутренним представлением данных (даже не данных а их структур) в VB, представлением данных в Windows (так же как и в Си) и представлением данных на диске в файле. VB и Windows выравнивают данные по естественным границам (Integer занимает 2 байта, Long - 4, Byte - соответственно 1). Byte может находится в любом месте структуры. Integer -выравнивается по четным адресам, а Long по адресам кратным 4. это, когда структура находится в оперативке. в файле структура в сегда выравнивается по границе байта.

вот простой пример:
Код: Выделить всё
Private Type tTest
  i As Integer
  l As Long
End Type

Private Sub Form_Load()
  Dim t As tTest
 
  Print Len(t), LenB(t)
End Sub
как вы думаете что будет на форме?
на форме будет 6 и 8. т.е. длина структуры = 6, а в байтах длина = 8
вот...
да кстати, это я пересказывал Эплмана...
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 21.01.2004 (Ср) 8:43

Действительно, ресурсы в файле RES характеризуются размерами до байта, т.е. реальными, но в EXE их размеры увеличиваются (выравниваются) до кратных 4 байтам.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 6

    TopList