Страница: 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