Страница: 1 | 2 |
Вопрос: Пара вопросов
Добавлено: 21.01.05 07:13
Автор вопроса: Mihalыch | ICQ: 373-509-101
УРА, заработало, а то у меня уже ломка началась.
Всем привет!
У меня возникло пара вопросов.
1. Допустим, создаем проект, на форму кидаем метку, присваиваем её Caption’у какое-то значение. Открываем файл формы в блокноте и видим (Caption = "Наше значение"), но если присвоить сильно длинную строку, то увидим, например (Caption = $"frmMain.frx":0CCA). Понятно, что здесь указан двоичный файл, где хранится наша длинная строка, и какой-то адрес (наверное в HEX). Вопрос, как найти/выделить эту строку из frx’а?
2. Допустим в файле инициализации, есть ключ 1= значение , если получить его значение, то получится “значение”, а можно ли получить его как есть, т.е. “ значение ”?
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 21.01.05 07:37
То что я увидел из Hex-Viewer'а FAR'а
Тексту метки предшествуют коды: 01 13 00 00 (вероятно какой то Long).
А завершает код: 0F.
Смещение там указано относительно нуля (т.е. начала файла). Вроде ничего сложного нет. Что у тебя вызвало затруднение?
Номер ответа: 2
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #2
Добавлено: 21.01.05 07:45
Вопрос в том, как программно, на VB, получить эту строку?
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 21.01.05 08:01
Открывай файл для двоичного доступа и грузи с помощью GET.
Номер ответа: 4
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #4
Добавлено: 21.01.05 08:14
CyRax, вот смотри есть адрес (0CCA в Dec - 3274), как его разобрать? Где здесь смещение, указывающее на начало и конец строки, или на начало и длину?
Ну не могу я понять…
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 21.01.05 08:51
Смещений на конец и длину я там не нашёл. Скорее всего что их там нет (я более чем уверен, но если ты сомневаешся - проверь). Число 3274 указывает на позицию начала строки в файле, которая заканчивается кодом &HF (15). Определять конец можно например по началу данных следующей строки или же по коду 15.
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 21.01.05 08:54
Вот так расположены данные в файле
0CCA -> 01|13|00|00|Label1|0F
Номер ответа: 7
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #7
Добавлено: 21.01.05 09:01
CyRax, вряд ли, размер frx файла всего - 13 325 байт. Но все равно спасибо, а по второму вопросу, ответ я понял = не как?
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 21.01.05 09:13
Первые 4 байта скорее всего внутренняя сигнатура метки в VB. Хотя я и не уверен что это константа, возможно что у разных компов будут разные числа.
Простым подсчётом получи её значение и сверь:
Signature = &H100 * &H13 + 1
Здесь &H13 - значение второго байта, а 1 - первого. Полная формула может выглядеть так:
Signature = &H1000000 * Byte4 + &H10000 * Byte3 + &H100 * Byte2 + Byte1
Номер ответа: 9
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #9
Добавлено: 21.01.05 09:16
Спасибо! Попробую.
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 21.01.05 09:18
CyRax, вряд ли, размер frx файла всего - 13 325 байт. Но все равно спасибо, а по второму вопросу, ответ я понял = не как?
А почему бы и нет? Ведь 3274 меньше 13 325. Я тебе показал то что у меня было в FRM и FRX файлах. А то что у тебя - так посмотри и скажи мне.
Номер ответа: 11
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #11
Добавлено: 21.01.05 09:46
Пока выяснил вот что:
1. позиция первого символа строки в файле frx – 1246
2. длина строки – 334
3. строка оканчивается символом с кодом 1
Номер ответа: 12
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #12
Добавлено: 21.01.05 10:40
По первому вопросу: лучше скажите, чему будет равен идентификатор ресурса в откомпиленном файле. Может в этом дело?
Насчет второго вопроса: почему бы нет, напиши свой парсер ini А кавычки одинарные или двойные как себя ведут?
Номер ответа: 13
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #13
Добавлено: 21.01.05 10:52
mc-black, по первому вопросу, программа работает именно с файлами проекта, по второму, конечно можно заменить крайние пробелы (если они есть) на скажем chr(1), а при получении значения ключа, снова заменить их на chr(32), но я подумал, может есть возможность без этого получить строку в исходном виде.
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 21.01.05 12:49
Скорее всего что там данные расположены именно так как я описывал.
Потому как я в проекте делал 2 метки, текстовое поле и ещё несколько контролов.
Длинный текст меток и текстового поля находился именно по тем адресам, которые были указаны в FRM-файле.
Различия были только в сигнатурах. У меток одна сигнатура (01|13|00|00 ... 15), а у текстового поля другая.
Номер ответа: 15
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #15
Добавлено: 21.01.05 18:24
CyRax, ты был абсолютно прав, это адрес первого символа - 4. Вот этой ф-й у меня получилось выдрать эти строки из frx'а. Правда с окончанием строки гемор, оканчивается разними символами, закономерности я не нашел.
Private Function GetFrxData(sPath As String, Displacement As Long) As String
 im i As Long
 im Min As Long
 im hMem As Long
 im hFile As Long
 im InStrRes As Long
 im sInput As String
 im aByte() As Byte
ReDim aByte(0 To FileLen(sPath) - Displacement)
hMem = VarPtr(aByte(0))
hFile = CreateFile(sPath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)
SetFilePointer hFile, Displacement + 4, 0, FILE_BEGIN
ReadFile hFile, ByVal hMem, FileLen(sPath), FileLen(sPath), 0
CloseHandle hFile
sInput = Space(FileLen(sPath))
CopyMemory ByVal sInput, ByVal hMem, UBound(aByte)
Min = FileLen(sPath)
For i = 31 To 1 Step -1
InStrRes = InStr(1, sInput, Chr(i))
If InStrRes < Min And InStrRes > 0 Then Min = InStrRes
Next i
GetFrxData = Trim(Mid(sInput, 1, Min - 2))
End Function