Страница: 1 |
Страница: 1 |
Вопрос: Копирование своего типа данных в байтовый массив
Добавлено: 28.08.07 11:38
Автор вопроса: Nonamer | Web-сайт:
Уважаемые программисты!
Хочу задать вам вопрос следующего типа:
При копировании собственного типа данных (включая и вложенные типы) VB делает выравнивание структуры в памяти, что делает практически невозможным вызов функции CopyMemory для копирования этой структуры в байтовый массив. Небольшой пример:
Private Type mType
A1 As Byte
A2 As Integer
End Type
...
...
Dim D(10) As Byte
Dim mVar AS mType
mVar.A1=&H1
mVar.A2=&HFEFA
...
CopyMemory D(0), mVar, LenB(mVar)
...
Содержимое массива должно быть :
&H01 &HFA &HFF
А реально содержимое:
&H01 &H00 &HFA &HFF
т.е. VB выровнял байт по (как я полагаю) максимальной длинне типа, входящего в структуру.
Подскажите плз, как это обойти.
Заранее благодарен!
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 28.08.07 13:44
Почему D именно такого размера?
Попробуйте при копировании использовать функции для работы с указателями.
Номер ответа: 2
Автор ответа:
Nonamer
ICQ: 268674940
Вопросов: 31
Ответов: 69
Web-сайт:
Профиль | | #2
Добавлено: 28.08.07 14:12
Размер D я взял посто для примера.
А вот про указатели немного поподробнее можно?
Номер ответа: 3
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #3
Добавлено: 28.08.07 17:39
даже в ms vs 2003 в с++ проектах, при объявлении в структуре элементов длиной байт, всё выравнено на 4. И при прринудетльной установке в выравнивание в 1 байт компилятор творил такое, что больше прога не работала пришлось использовать компилятор от интел. все отлично пахает и выравнивание байт так что хз что вам делать. у мс косяки с выравниванием какието. попробуйте копировать по одному элементу, указывая его длину. и так всю структуру
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 28.08.07 17:47
Объяви тип в tlb - и не будет тебе никакого гемора с выравниванием.
Номер ответа: 5
Автор ответа:
Nonamer
ICQ: 268674940
Вопросов: 31
Ответов: 69
Web-сайт:
Профиль | | #5
Добавлено: 28.08.07 18:02
Не в курсе как это делать
А поподробнее или примерчик можно?
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 28.08.07 18:48
MIDL имеется?
Создаешь файлик noob.idl
Пихаешь туда примерно такое (uuid сгенеришь сам)
[
uuid(99257AE4-0D59-45eb-B56C-8CA4FE4C23BD),
version(1.0)
]
library MTypeLib {
importlib("stdole32.tlb"
[
uuid(CB998155-FEB2-4ccd-B28D-00C505F68C6F),
]
typedef struct mType
{
BYTE A1;
short A2;
} mType;
};
Затем с командной строки:
midl /Zp1 noob.idl >Result.txt
И усе путем
Подключаешь к проекту, юзаешь. С компиленым проектом таскать tlb не надо.
Номер ответа: 7
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #7
Добавлено: 28.08.07 19:58
зачте припахать к такому делу idl - даж я до такого бы не додумался
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 29.08.07 14:41
А что так угнетает? Кстати, подобные типы вполне можно передавать как аргумент в функции-члены любого класса.
Номер ответа: 9
Автор ответа:
Nonamer
ICQ: 268674940
Вопросов: 31
Ответов: 69
Web-сайт:
Профиль | | #9
Добавлено: 30.08.07 14:08
Во! Заработало!
Огромное спасибо!