Ручное формирование .res файлов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2005 (Чт) 15:24

hCORe писал(а):Близко к тому, чтобы заработало :D

Странный прикол с выводом строк: если пишешь
Код: Выделить всё
Open "H:\a.bin" For Binary As #1
    Put #1, , StrConv("Hello", vbUnicode)
    Put #1, , "-- delimiter --"
    Dim s As String
    s = StrConv("Hello", vbUnicode)
    Put #1, , s
Close


То в a.bin будет (hex):
08 00 0A 00 48 00 65 00 6C 00 6C 00 6F 00 2D 2D
20 64 65 6C 69 6D 69 74 72 20 2D 2D 48 00 65
00 6C 00 6C 00 6F 00


Жирным выделена сама строка "Hello" в Unicode, подчеркнут заголовок Unicode-строки.

То есть, если пишем
Код: Выделить всё
Put #1, , StrConv("Hello", vbUnicode)

- то получаем полноценный Юникод, а если
Код: Выделить всё
Dim s As String
s = StrConv("Hello", vbUnicode)

- то полноценный ANSI с Unicode-кодированием "внутри".

Забавно... Из-за этого и глючила запись строк. Теперь, вроде, поправил. Как только что-нибудь заработает - сразу выложу рабочую версию. ОК?

Только при чём тут строки?
Открываем Object Browser, видим:
Function StrConv(String, Conversion As VbStrConv, [LocaleID As Long])

Обращаем внимание, что она возвращает Variant.

Т.е. в первом случае ты пишешь в файл вариант, а во втором - строку. Никаких чудес.
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 01.09.2005 (Чт) 16:04

А ты думал?!..
Моду создают модоки, а распространяют модозвоны.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.09.2005 (Чт) 17:30

А что бы вам ICQ не завести-то?... :roll:
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 01.09.2005 (Чт) 19:05

BV:
1) Мне самому интересно, чем все это кончится.
2) Хочу, чтобы все остальные узнали, как правильно писать стрингтейблы в файл ресурсов.
3) Лениво заводить ICQ.
______________

Модифицированная версия. Пишет всего две строчки (английскую и русскую) в .res-файл. Длина - 96 байт. Т.е. кратна 32. Нет! Не работает! Зато файл, сгенерированный стандартным редактором ресурсов, имеет длину в 116 байт (не кратную 32) и отлично открывается.

Думаю, нужно делать паддинг для каждой строки.
А еще - у меня неправильно подсчитывается длина данных. Длину паддинга я НЕ добавляю!

Исходники прилагаются.
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2005 (Чт) 21:13

hCORe писал(а):А ты думал?!..

Да, я думал.



Сейчас посмотрю новую версию.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2005 (Чт) 21:45

Вот так работает
Код: Выделить всё
Comparing files Form1.frm and FORM1.NEW
***** Form1.frm
Private Sub Form_Load()
    Dim strings(1) As String
    Dim i As Integer
***** FORM1.NEW
Private Sub Form_Load()
'Ты же сам только что квотил, что строк должно быть ровно 16?
    Dim strings(15) As String
    Dim i As Integer
*****

***** Form1.frm

    For i = 0 To 1
        rh.datasize = rh.datasize + LenB(strings(i))
***** FORM1.NEW

    For i = LBound(strings) To UBound(strings)
        rh.datasize = rh.datasize + LenB(strings(i))
*****

***** Form1.frm

    For i = 0 To 1
        Put #l, , CInt(Len(strings(i)))
        strings(i) = StrConv(strings(i), vbUnicode)
        Put #l, , strings(i)
    Next i
***** FORM1.NEW

    For i = LBound(strings) To UBound(strings)
        Put #l, , CInt(Len(strings(i)))
        Put #l, , CStr(StrConv(strings(i), vbUnicode))
    Next i
*****

***** Form1.frm

    Dim p As Long
    p = 32 - (LOF(l) Mod 32)
    If p = 32 Then p = 0
    Put #l, LOF(l) + p, CByte(0)
    Close #l
***** FORM1.NEW

' Выравниваться должны заголовки, а не конец файла
'    Dim p As Long
'    p = 32 - (LOF(l) Mod 32)
'    If p = 32 Then p = 0
'    Put #l, LOF(l) + p, CByte(0)
    Close #l
*****
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 02.09.2005 (Пт) 14:16

Теперь дошло... Буду писать версию с двумя таблицами.

Скоро выложу.
Моду создают модоки, а распространяют модозвоны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 02.09.2005 (Пт) 20:31

Выкладываю новую версию. Работает, но чуть кривовато. Сравниваем ресурс "Embedded into the Library.res" и сгенерированный программой из библиотеки "language1033.dll" ресурс. Все строки из исходного файла есть, но находятся в неправильном порядке (по ID). Странно...
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.09.2005 (Сб) 22:36

hCORe писал(а):Все строки из исходного файла есть, но находятся в неправильном порядке (по ID). Странно...

Не просто в неправильном, а в противоположном.
Запусти цикл в другую сторону, что ли? :-?
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 03.09.2005 (Сб) 22:39

И точно... :D
Поправим!
Моду создают модоки, а распространяют модозвоны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 04.09.2005 (Вс) 16:58

Поправлено. Зато - не работает на совершенно пустяковом проекте.

Мое мнение: надо делать паддинг для заголовков (RESHEADER). Другой вопрос - как определить, что он нужен...

Проект прилагается:
Вложения
LocaHelper3.rar
locahelper 3. строки идут в нормальном порядке. зато есть другие проблемы...
(11.88 Кб) Скачиваний: 35
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.09.2005 (Вс) 17:40

hCORe писал(а):Мое мнение: надо делать паддинг для заголовков (RESHEADER). Другой вопрос - как определить, что он нужен...

Дык он всегда нужен.
Перед концом файла - не нужен. А перед заголовком - всегда нужен.
Вроде бы, это было в твоём мануале указано?
Изображение

Shura
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 17.09.2005 (Сб) 13:25

Мое первое сообщение на этом форуме!

Сообщение Shura » 17.09.2005 (Сб) 13:56

Меня сюда tyomitch направил, говорит мы тут проект разрулили по строковым ресурсам. Я и поверил :) Скачал - не работает :(. Тогда мессаги уже читать взялся и тут увидел что... Только вы не обижайтесь, бывалые и продвинутые, но вы тут просто уже заработались до зеленых чертиков :D
Это ж надо было до такого додуматься - DWORD превратить в 32 байта!!! :shock: И обсуждают, чтобы еще такого по ним выровнять. Фестиваль юмора просто, повеселили старика, спасибо вам, ребята.

Будем смотреть дальше. А вообще нужно бы добавить элементарную, но очень (мне по крайней мере) оказавшуюся нужной фичу - указание локали для генерируемой Unicode строки. Благо в VB6 (в VB5 еще не было) делается это элементарно:
Код: Выделить всё
Put #l, , CStr(StrConv(arrStrings(i), vbUnicode, НужнаяНамЛокаль))


PS Нравится мне этот форум: до сих пор мой ник еще никто не занял :D :D :D

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.09.2005 (Сб) 15:30

До фиолетовых чертиков заработались. Я уже даже не помню, работает мой последний вариант (не выложенный сюда) или нет...
Моду создают модоки, а распространяют модозвоны.

Shura
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 17.09.2005 (Сб) 13:25

Сообщение Shura » 17.09.2005 (Сб) 15:38

hCORe писал(а):До фиолетовых чертиков заработались. Я уже даже не помню, работает мой последний вариант (не выложенный сюда) или нет...

О том, который не выложен, я не знаю, а вот LocaHelper3.rar не работает точно. Ему как минимум не хватает вот такой корректировки:
Код: Выделить всё
...
        rh.headersize = Len(rh)
       
        Dim newPos&
        newPos = Seek(1)
        newPos = newPos + IIf(((newPos - 1) Mod 4), 4 - (newPos - 1) Mod 4, 0)
       
        Put #l, newPos, rh
        For i = a To b
            Put #l, , CInt(Len(arrStrings(i)))
            Put #l, , CStr(StrConv(arrStrings(i), vbUnicode))
        Next i

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.09.2005 (Сб) 15:45

LocaHelper 3 доработан. Мой способ несколько другой. Я дописываю паддинг в конец. Вот полный вариант процедуры CreateRes модуля mdlLanguage:

Код: Выделить всё
Public Sub CreateRes(sPath As String, arr() As String)

    Dim rh As RESHEADER
   
    Dim l As Byte
    l = FreeFile
    On Error Resume Next
    Kill sPath
    Err.Clear
    Open sPath For Binary As #l
   
    'пустой заголовок - 16 байт
    Dim sc(31) As Byte
    sc(0) = 0
    sc(1) = 0
    sc(2) = 0
    sc(3) = 0
    sc(4) = &H20
    sc(5) = 0
    sc(6) = 0
    sc(7) = 0
    sc(8) = &HFF
    sc(9) = &HFF
    sc(10) = 0
    sc(11) = 0
    sc(12) = &HFF
    sc(13) = &HFF
    sc(14) = 0
    sc(15) = 0
   
    Dim f As Long
       
    Put #l, , sc
   
    Dim a As Long, b As Long, c As Long, i As Long, z As Long
       
    a = 0
    b = 15
    c = 7
   
    Dim arrStrings() As String
   
    Dim v As Long
   
    Const ZZA As Integer = 5        'количество строк до 101 - 1
   
    If (UBound(arr) - LBound(arr) + ZZA) Mod 16 <> 0 Then
        z = 16 - (UBound(arr) - LBound(arr) + ZZA) Mod 16 - 1
    Else
        z = UBound(arr) - LBound(arr) + ZZA - 1
    End If
   
    ReDim Preserve arrStrings(0 To UBound(arr) - LBound(arr) + z + ZZA)
   
    For i = LBound(arr) To UBound(arr)
        arrStrings(ZZA + i - LBound(arr)) = arr(i)
    Next
   
       
    Do
       
        rh.datasize = 0
       
        For i = a To b
            rh.datasize = rh.datasize + LenB(arrStrings(i))
        Next
       
        'плюс информационные поля для строк
        rh.datasize = rh.datasize + 32
       
        rh.dataversion = 0
        rh.flags = 0
        rh.id = CLng("&H" & Hex$(c) & "FFFF")     'таблица c
        rh.language = 0     'lang neutral, sublang neutral
        rh.type = &H6FFFF   'RT_STRING
        rh.headersize = Len(rh)
               
        Put #l, , rh
        For i = a To b
            Put #l, , CInt(Len(arrStrings(i)))
            Put #l, , CStr(StrConv(arrStrings(i), vbUnicode))
        Next i
        a = a + 16
        b = b + 16
        c = c + 1
       
        'выравнивание по границам DWORD (32 бита [4 байта])
        Dim j As Long
        j = 4 - LOF(l) Mod 4
        If j = 4 Then j = 0
        Put #l, LOF(l) + j, CByte(0)
       
    Loop Until a >= UBound(arrStrings) + 1
       
    Close #l

End Sub


На всех примерах, что у меня есть, работает. Правильно говорил кто-то из писателей: чтобы решить проблемы с материалом, надо дать ему "отлежаться".
Моду создают модоки, а распространяют модозвоны.

Shura
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 17.09.2005 (Сб) 13:25

Сообщение Shura » 17.09.2005 (Сб) 16:12

hCORe писал(а):LocaHelper 3 доработан. Мой способ несколько другой. Я дописываю паддинг в конец.

Хрен редьки не слаще :). Хотя обычно, говоря о выравнивании, имеют ввиду выравнивание именно вначале.
Ну, так что, ты дальше русификации ресурсов не собираешься идти? Например в локализацию на другие языки. Вот у меня тут были проблемы с Немецкими ресурсами. Все хваленые компиляторы (например тот же Resource Builder) обломались правильно их cкомпилить, только микрософтовский RC.exe смог, да и то только после добавления весьма экзотической (не описанной даже в его справке) директивы в RC-скрипт.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.09.2005 (Сб) 16:18

Хрен, конечно, редьки не слаще, но работает. А другой язык можно задать через rh.language и в третьем параметре StrConv. Дальше я идти собираюсь, но на данный момент меня вполне устраивает версия "альфа", которую я доделал полчаса назад.
Моду создают модоки, а распространяют модозвоны.

Shura
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 17.09.2005 (Сб) 13:25

Сообщение Shura » 17.09.2005 (Сб) 17:13

hCORe писал(а):А другой язык можно задать через rh.language и в третьем параметре StrConv..

Сначала наступи на эти грабли, а потом уж говори. rh.language всего-лишь запишет пару байтиков в заголовок ресурса, но никак не изменит Unicode строк в ресурсе. Да и с чего они будут меняться-то? А третий параметр в StrConv - рулит.

Ладно, буду сам под себя переписывать код, как и предполагалось, собсна, изначально.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.09.2005 (Сб) 17:17

Я и сказал: rh.language установит атрибут языка, а StrConv позволит нормально записать национальные символы этого языка. :)
Моду создают модоки, а распространяют модозвоны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.09.2005 (Сб) 17:18

Когда сделаешь проект для себя, выложи для других. Очень уж хочется посмотреть :P
Моду создают модоки, а распространяют модозвоны.

Shura
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 17.09.2005 (Сб) 13:25

Сообщение Shura » 17.09.2005 (Сб) 18:56

hCORe писал(а):Я и сказал: rh.language установит атрибут языка, а StrConv позволит нормально записать национальные символы этого языка. :)

Мне как раз и не нужен был немецкий атрибут (меня нейтральный вполне устраивает), мне главное, чтобы у немцев строки немецкие были видны, а не киргуду (умляуты немецкие пропадают, точнее подменяются на символы ?).

hCORe писал(а):Когда сделаешь проект для себя, выложи для других. Очень уж хочется посмотреть :P

С какой стати? Я же буду делать его для себя. Да и тебе он не понравится, ибо ничего смешного там не будет (например 32 байтных DWORD-ов :).

Пред.

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

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

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

    TopList  
cron