Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Копирование своего типа данных в байтовый массив Добавлено: 28.08.07 11:38  

Автор вопроса:  Nonamer | Web-сайт: nonsoft.narod.ru | ICQ: 268674940 
Уважаемые программисты!
Хочу задать вам вопрос следующего типа:
При копировании собственного типа данных (включая и вложенные типы) 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-сайт: nonsoft.narod.ru
 Профиль | | #2
Добавлено: 28.08.07 14:12
Размер D я взял посто для примера.
А вот про указатели немного поподробнее можно?

Ответить

Номер ответа: 3
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #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-сайт: nonsoft.narod.ru
 Профиль | | #5
Добавлено: 28.08.07 18:02
Объяви тип в tlb - и не будет тебе никакого гемора с выравниванием.


Не в курсе как это делать :(
А поподробнее или примерчик можно?

Ответить

Номер ответа: 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-сайт: www.rascalspb.narod.ru
 Профиль | | #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-сайт: nonsoft.narod.ru
 Профиль | | #9
Добавлено: 30.08.07 14:08
Во! Заработало! :)
Огромное спасибо!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам