Помогите заполнить структуру из бинарного файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 9:03

Приветствую!

Проблема: вылетаю по несоответствию типа, либо получаю абракадабру, когда заполняю структуру из BIN вайла.
Бинарь, из которого читаю, прикладываю.
Структрура переделана из С:

Код: Выделить всё
struct WNDINFO
{
LONG exStyle;
LONG hInstance;
LONG hwndParent;
LONG style;
LONG id;
LONG userData;
LONG wndProc;
LONG x0;
LONG x1;
wchar_t className[32];
wchar_t text[32];
};

Размерность структуры = MSG + мои данные - итого 192 байта. Сам MSG 28 байт

Вот код, который должен структуру заполнять, но этого не делает (( :

Код: Выделить всё
Option Explicit

Public Type WNDInfo
    ExStyle   As Long
    hInstance   As Long
    hWndParent   As Long
    Style  As Long
    ID   As Long
    UserData   As Long
    WndProc  As Long
    x0   As Long
    X1   As Long
    ClassName  As String * 32
    Text  As String * 32
End Type

Public BIN_File_Info() As WNDInfo

Public Sub Get_BIN_File_Struct(ByVal BIN_File As String)
    Dim k
       
    ReDim BIN_File_Info(0)

    Open BIN_File For Binary Access Read As #1
        k = Input(CInt(frm_GUICodeGen.Text1.Text), #1)
   
        Do While Not EOF(1)
            'On Error GoTo jump
            ReDim Preserve BIN_File_Info(UBound(BIN_File_Info) + 1)
           
            With BIN_File_Info(UBound(BIN_File_Info))
                k = Input(4, #1):   .ExStyle = CLng(k)           'Расширенный стиль
                k = Input(4, #1):   .hInstance = CLng(k)       'Инстансь
                k = Input(4, #1):   .hWndParent = CLng(k)      'hWnd родителя
                k = Input(4, #1):   .Style = CLng(k)           'Стиль
                k = Input(4, #1):   .ID = CLng(k)              'ID
                k = Input(4, #1):   .UserData = CLng(k)        'UserData
                k = Input(4, #1):   .WndProc = CLng(k)         'WndProc
                k = Input(4, #1):   .x0 = CLng(k)              'x0
                k = Input(4, #1):   .X1 = CLng(k)              'x1
                k = Input(32, #1):  .ClassName = k           'ClassName
                k = Input(32, #1):  .Text = k                'Text
            End With
        Loop
jump:
    Close #1
End Sub


На строку:
Код: Выделить всё
k = Input(CInt(frm_GUICodeGen.Text1.Text), #1)

внимания не обращайте. Это эксперемент со смещением был. Читать надо с самого начала файла.


Заранее, спасибо!
Вложения
binary.rar
(2.75 Кб) Скачиваний: 60
Последний раз редактировалось VBSunchutich 11.10.2010 (Пн) 12:09, всего редактировалось 1 раз.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 11:51

Файл записан корректно, и кем? Структура файла известна?
O, sancta simplicitas!

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 12:07

pronto писал(а):Файл записан корректно, и кем? Структура файла известна?

Записан корректно. Прогер, который файл заполняет, читает его без проблем.

Структура - блоки по 192 байта. Первые 28 байт - WM_ сообщение, остальное - структура:
Код: Выделить всё
struct WNDINFO
{
LONG exStyle;
LONG hInstance;
LONG hwndParent;
LONG style;
LONG id;
LONG userData;
LONG wndProc;
LONG x0;
LONG x1;
wchar_t className[32];
wchar_t text[32];
};

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 12:15

WM_ сообщение, это:
Код: Выделить всё
typedef struct tagMSG {
  HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
} MSG, *PMSG, *LPMSG;

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT, *PPOINT;


tagPOINT - это наш PointAPI

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 12:43

Спецификация файла есть?
Уверен, что всё дело в неполноте знания структуры файла...
На смещении 417 удалось прочитать такую строку
BuilderWizard ??? ???? Acronis Bootable Media Builder? 417
Между строками присутствуют ещё какие-то данные...
O, sancta simplicitas!

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 12:52

pronto писал(а):Спецификация файла есть?
Уверен, что всё дело в неполноте знания структуры файла...
На смещении 417 удалось прочитать такую строку
BuilderWizard ??? ???? Acronis Bootable Media Builder? 417
Между строками присутствуют ещё какие-то данные...


Спрогер сказал:
Cтрока заканчивается 0м, а дальше идет мусор
Ибо не все строки занимают 31 символ
Еще - на смещении 417 нельзя ничего корректно прочесть, ибо все данные расположены на смещении кратном 4м

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 13:00

Что то мне кажется, что члены структуры не в том порядке стоят.
BuilderWizard ??? ???? Acronis Bootable Media Builder? 417

из этой строки получается, что между BuilderWizard и Acronis Bootable Media Builder есть что-то ещё, но судя по структуре, это её поля ClassName и Text. И между ними ни чего быть не должно.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 13:01

Cтрока заканчивается 0м, а дальше идет мусор

Это одна из ключевых фраз!
Еще - на смещении 417 нельзя ничего корректно прочесть, ибо все данные расположены на смещении кратном 4м

Скажи, а смещение 1 кратно 4-м?
Нарисуй на тетрадном листе прямоугольник из 8-ми клеточек. Подели его пополам. Каждая клетка — это 1 байт. Пронумеруй байты начиная с единицы. С какого номера начнётся 2-я половина?
O, sancta simplicitas!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 13:44

Это правильные данные первых 12 структур?
Код: Выделить всё
0,1976827904,65554,-1946157056,0,0,-62999,0,0,CicMarshalWndClass ?  ????    ,CicMarshalWnd Я идиот! Убейте меня, кто-нибудь!?????????
260,4194304,0,349044736,0,33574088,-61135,0,0,BuilderWizard   ???  ????    ,Acronis Bootable Media Builder?
0,1976827904,65554,-1946157056,0,0,-62999,0,0,CicMarshalWndClass ?  ????    ,CicMarshalWnd Я идиот! Убейте меня, кто-нибудь!?????????
4,4194304,2296186,1442840576,0,33577936,-61267,1,0,FXHorizontalFrame ??  ????    ,   ???r?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????????
0,1976827904,65554,-1946157056,0,0,-62999,0,0,CicMarshalWndClass ?  ????    ,CicMarshalWnd Я идиот! Убейте меня, кто-нибудь!?????????
0,1976827904,65554,-1946157056,0,0,-62999,0,0,CicMarshalWndClass ?  ????    ,CicMarshalWnd Я идиот! Убейте меня, кто-нибудь!?????????
0,1976827904,65554,-1946157056,0,0,-62999,0,0,CicMarshalWndClass ?  ????    ,CicMarshalWnd Я идиот! Убейте меня, кто-нибудь!?????????
0,1976827904,65554,-1946157056,0,0,-62999,0,0,CicMarshalWndClass ?  ????    ,CicMarshalWnd Я идиот! Убейте меня, кто-нибудь!?????????
4,4194304,2296186,1442840576,0,33577936,-61267,1,0,FXHorizontalFrame ??  ????    ,   ???r?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????????
4,4194304,1510402,1442840576,0,33624352,-61181,2,0,FXDragCorner    ???  ????    ,   ???r?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????????
4,4194304,1510402,1442840576,0,33624352,-61181,2,0,FXDragCorner    ???  ????    ,   ???r?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????????
4,4194304,1510402,1442840576,0,33746424,-61267,3,0,FXHorizontalFrame ??  ????    ,   ???r?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????????

Не считая «мусора», конечно!
Последний раз редактировалось pronto 11.10.2010 (Пн) 13:47, всего редактировалось 1 раз.
O, sancta simplicitas!

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 13:47

Не считая поля Text, правильные )))

Ну новечёк я ещё в VB. Зачем ругаться....

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 13:53

Ну новечёк я ещё в VB. Зачем ругаться....

Это ты про строку «Я идиот! Убейте меня, кто-нибудь!»? Если, да, то это не в твой адрес. Это местный прикол такой. Сколько-то вопросительных знаков (и восклицательных, кажется) автоматически заменяются на такую строку.
Код: Выделить всё
А!!!!!!!!! (в оригинале ВОСКЛ, ВОСКЛ, ВОСКЛ, ВОСКЛ, ВОСКЛ, ВОСКЛ, ВОСКЛ)
А?Я идиот! Убейте меня, кто-нибудь!??? (в оригинале ВОПР, ВОПР, ВОПР, ВОПР, ВОПР, ВОПР, ВОПР)
Последний раз редактировалось pronto 11.10.2010 (Пн) 13:56, всего редактировалось 3 раз(а).
O, sancta simplicitas!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Помогите заполнить структуру из бинарного файла

Сообщение Twister » 11.10.2010 (Пн) 13:53

Код: Выделить всё
Private Type WNDInfo
    ExStyle   As Long
    hInstance   As Long
    hWndParent   As Long
    Style  As Long
    ID   As Long
    UserData   As Long
    WndProc  As Long
    x0   As Long
    X1   As Long
    ClassName  As String * 32
    Text  As String * 32
End Type

Private Sub CommandButton1_Click()
    Dim a As WNDInfo
    MsgBox Len(a)
End Sub
Стоит выполнить данный код и станет ясно - размер структуры WNDInfo 100 байт, а не 164. Строки не юникодные (ну, по крайней мере Excel 2003 так сказал ;) ).
А я все практикую лечение травами...

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 13:58

размер структуры WNDInfo 100 байт, а не 164

Стоит заглянуть внутрь файла fox.bin FAR'ом, например...
O, sancta simplicitas!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Помогите заполнить структуру из бинарного файла

Сообщение Twister » 11.10.2010 (Пн) 14:11

pronto писал(а):
размер структуры WNDInfo 100 байт, а не 164

Стоит заглянуть внутрь файла fox.bin FAR'ом, например...
Ты не понял. В файле всё корректно - 164 байта на структуру WNDInfo + 28 байт на tagMSG. Я говорю о том, что структура неверно объявлена в VB.

ЗЫ. А еще стоит внимательней читать сообщения, тогда сразу бы стало понятно, о чём я говорю ;)
А я все практикую лечение травами...

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 14:27

Да, всё понятно!
Только автор чего-то притих!
O, sancta simplicitas!

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 14:33

А что я скажу?? Twister сказал, что структура неверно объявлена, А что не так, я не пойму. Я ж ламо ещё в VB. Pronto, выложи плиз код, который первые 12 структур вернул. Я думаю, пойму, как доделать.

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 14:38

className и Text gj *64 должны быть!

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 14:45

Косяк найден! Бинарь писался в UCS2 кодировке. Переделали на ACSII. Сейчас затестю

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 14:48

Хорошо, выкладываю.
Код: Выделить всё
Option Explicit

Private Type WNDInfo
    'tagMessage(27) As Byte ' As String * 28
    ExStyle   As Long
    hInstance   As Long
    hWndParent   As Long
    Style  As Long
    ID   As Long
    UserData   As Long
    WndProc  As Long
    x0   As Long
    X1   As Long
    sClassName(63) As Byte 'As String * 32
    sText(63) As Byte ' As String * 32
End Type

Private BIN_File_Info() As WNDInfo

Private Sub Get_BIN_File_Struct(ByVal BIN_File As String)
   Dim b As Long, st As Long, i As Long
   Dim str1 As String, str2 As String, str3 As String
   
   Dim fn As Long
   fn = FreeFile
   
   ReDim BIN_File_Info(b)

   Open BIN_File For Binary Access Read As #fn
   
        st = 417 '
        'Get #fn, st, BIN_File_Info(b)
   
        Do While Not EOF(1)
            Get #fn, st, BIN_File_Info(b)
           
            st = st + 192
            b = b + 1 ': st = st + LenB(BIN_File_Info(0))
            ReDim Preserve BIN_File_Info(b)
           
        Loop
       
    Close #fn

   For i = 0 To 3
      str2 = BIN_File_Info(i).sClassName
      str3 = BIN_File_Info(i).sText
     
      With BIN_File_Info(i)
         Debug.Print .ExStyle & "," & .hInstance & "," & .hWndParent & "," & .Style & "," & .ID & "," & .UserData & "," & .WndProc & "," & .x0 & "," & .X1 & "," & str2 & "," & str3                            ' BIN_File_Info(i).sText
      End With
   Next
   
End Sub

Private Sub Command1_Click()
   Get_BIN_File_Struct ByVal App.Path & "\fox.bin"
End Sub


UPD: Это для бинарника в UCS2 кодировке.
Последний раз редактировалось pronto 11.10.2010 (Пн) 14:51, всего редактировалось 2 раз(а).
O, sancta simplicitas!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Помогите заполнить структуру из бинарного файла

Сообщение Twister » 11.10.2010 (Пн) 14:49

VBSunchutich писал(а):Косяк найден! Бинарь писался в UCS2 кодировке. Переделали на ACSII. Сейчас затестю
В бинарь писались юникодные строки, кодировка тут не при чём.
А я все практикую лечение травами...

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 15:18

Всё дядьки! Работает!!!!!! Сгорая от стыда пойду читать умные книжки! СПАСИБО!!!!!!!

VBSunchutich
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 07.10.2010 (Чт) 13:53

Re: Помогите заполнить структуру из бинарного файла

Сообщение VBSunchutich » 11.10.2010 (Пн) 15:18

Pronto, ОГРОМНОЕ ТЕБЕ СПАСИБО!!!!!!!!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Помогите заполнить структуру из бинарного файла

Сообщение pronto » 11.10.2010 (Пн) 15:26

Пожалуйста! Лишь бы на пользу пошло!
:D
Не надо так убиваться!
O, sancta simplicitas!


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 96

    TopList