Пользовательские типы данных

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Пользовательские типы данных

Сообщение Brusco » 31.01.2006 (Вт) 2:26

Итак, переписал я с Delphi часть кода:

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

Dim BitmapFile As Long
Dim Result As Long
Dim FH As BITMAPFILEHEADER
Dim ReadBytes As Long

BitmapFile = CreateFile("c:\1.bmp", GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0, 0)

Result = ReadFile(BitmapFile, VarPtr(FH), Len(FH), ReadBytes, ByVal 0&)
Form1.Print FH.bfSize

CloseHandle BitmapFile


Интересно то, что там наверно работало, а VB не работает :!:

Должен считаться заголовок bmp-файла, примерно такой (14 байт):
42 4D 36 00 03 00 00 00 00 00 36 00 00 00

Первая переменная типа BITMAPFILEHEADER содержит правильное значение 19778, а вот дальше всё неправильно - 3 0 54 и 0 :?

С чем это может быть связано? Может глючат пользовательские типы данных!?

А самое интересное, что в C++Builder получается тоже самое, да и ещё sizeof выдаёт 16 байт вместо 14!

Wild VB Code for Food
Постоялец
Постоялец
 
Сообщения: 387
Зарегистрирован: 16.06.2005 (Чт) 17:34
Откуда: ты, друг? =)) Сообщений: 1234

Сообщение Wild VB Code for Food » 31.01.2006 (Вт) 3:37

Конечно понимаю что Апи быстрей, однако в ВБ есть (сохранился ещё с архаических QBasic) оператор Open

Dim FH as BITMAPFILEHEADER

Open "C:\1.bmp" For Binary As #1

get #1,,FH
Лучше думать чем жевать.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.01.2006 (Вт) 10:00

Wild VB Code for Food писал(а):Конечно понимаю что Апи быстрей, однако в ВБ есть (сохранился ещё с архаических QBasic) оператор Open


Будь добр - скажи насколько быстрей. А то меня этот вопрос дико мучает. В общем, приведи цифры...

:lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.01.2006 (Вт) 12:02

Определение BITMAPFILEHEADER в wingdi.h такое:

typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;


Собственно 14 байт, но с учетом выравнивания получается именно 16. Если определять размер функцией Len - получим 14 байт, а если через функцию LenB (что правильнее) то как раз таки 16!
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение Vi » 31.01.2006 (Вт) 15:30

А если еще точнее:
Код: Выделить всё
#include <pshpack2.h>
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
#include <poppack.h>

pshpack2 означает, что выравнивание на 2 байта, а не на 4, как предполагается в VB.

Разбивай "DWORD bfSize" на "WORD bfSize1, bfSize2" и потом собирай bfSize заново.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.01.2006 (Вт) 15:34

Вы будете смеяться, но у меня из файла берётся правильно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 01.02.2006 (Ср) 3:01

Попробовал через LenB - 16 байт, но результат тот же, возвращает 3 :(

Вот адреса переменных в типе:
1242164 - bfType
1242168 - bfSize
1242172 - bfReserved1
1242174 - bfReserved2
1242176 - bfOffBits

Из этого получается, что bfType равна 4 байтам, но в Integer заносятся только первые 2, а bfSize остаётся как раз число 3 - чертовщина какая-то!

Небольшой кодик написал для сравнения в 3 компиляторах:
Код: Выделить всё
#include <windows.h>

#include <iostream.h>
#include <conio.h>

void main()
{

   char FileName[9] = "c:/1.bmp";
   HANDLE BitmapFile;
   //unsigned long BitmapLength;
   unsigned long ReadBytes;

   BITMAPFILEHEADER FileHeader;
   //BITMAPINFOHEADER InfoHeader;

   BitmapFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);

   if (BitmapFile == INVALID_HANDLE_VALUE)
   {
      MessageBox(0, "Error opening", "BMP Unit", MB_OK);
   }

   ReadFile(BitmapFile, &FileHeader, sizeof(FileHeader), &ReadBytes, NULL);

   cout<<FileHeader.bfSize;

   CloseHandle(BitmapFile);

   getch();


}


VC++ 6.0 - работает нормально, возвращает что и положено.
Borland C++ 5.02 - работает ещё лучше!
Builder C++ 6.0 - глючит как и VB :?

Может это связано с настройками компилятора? и GSerg, у тебя что правда работает :shock:

Ещё вопросик, почему в C++ всё время проблемы со слэшем?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.02.2006 (Ср) 4:17

GSerg, у тебя что правда работает :shock:

Правда работает, а что?

Ещё вопросик, почему в C++ всё время проблемы со слэшем?

Потому что у кого-то руки кривые? Слова "escape-последовательность" о чём-нибудь говорят?..
И прекрати использовать / в файловой системе. В файловой системе используется \.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 02.02.2006 (Чт) 4:18

GSerg писал(а):Правда работает, а что?

VB? Какая версия? SP?

GSerg писал(а):Потому что у кого-то руки кривые? Слова "escape-последовательность" о чём-нибудь говорят?..
И прекрати использовать / в файловой системе. В файловой системе используется \.

Нет не слышал или не помню про такую последовательность.
А про файловую систему, я использовал такой слэш \, но Builder вместо него в лучшем случае подставляет пустую строку, а бывает и какие-то символы (:) наверно ищет что-то типа '\n'). Я просмотрел разные исходники и в одном нашёл строку к файлу с таким слэшем /, посчитав это выходом из положения.
Вот я и спросил, что за глюки?

По существу вопроса: зарегил я такую самую структуру, только с другим именем, и что... Builder возвращает правильное значение, а со структурой в wingdi.h глючит :!:
Значит никто не знает почему?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.02.2006 (Чт) 5:19

Brusco писал(а):VB? Какая версия? SP?

Да. 6. 6.

Brusco писал(а):Нет не слышал или не помню про такую последовательность.
Вот я и спросил, что за глюки?

Долго объяснять. Поищи в MSDN по слову escape.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 02.02.2006 (Чт) 5:36

Да, всё таки глюки:

Argument is missing in '\' escape sequence.

This error generally occurs during search or replace when regular expressions or wildcards are used in a search string. This error can be caused by a single backslash (\) at the end of a pattern or by \x or \u entered without a valid hexadecimal Unicode character.
To correct this error

1. To search using the regular expression escape character, enter \.
2. To search for a Unicode character, enter \x or \u followed by a valid Unicode value.
3. To search for the literal backslash, use \\.


И придётся мне SP6 поставить, может заработает...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.02.2006 (Чт) 11:51

Мдя... тяжелый случай... может все-таки почитаешь про escape-последовательности то?
Весь мир матрица, а мы в нем потоки байтов!

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 03.02.2006 (Пт) 3:17

!Viper! писал(а):Мдя... тяжелый случай... может все-таки почитаешь про escape-последовательности то?


:) А наверху что написано?

Вообщем поставил SP6 - никакого толку, как ни работало так и не работает!
:cry: Придётся наверно на VC++ писать, а ведь так на Builder и VB надеялся.


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

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

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

    TopList  
cron