Я разрабатываю клиент TCP/IP, который должен иметь дело с собственным двоичным протоколом. Я рассматривал использование пользовательских типов для представления заголовков протоколов и использование CopyMemory для перетасовки данных в и из UDT и массива байтов. Однако, похоже, что VB6 добавляет байты заполнения для выравнивания пользовательских типов. Есть ли способ заставить VB6 не заполнять UDT, аналогично директиве #pragma, доступной во многих компиляторах C/C++? Может быть, специальный коммутатор перешел к компилятору?Имеет ли VB6 эквивалент пакета #pragma?
3
A
ответ
4
No.
Лучше писать код низкого уровня в C или C++ (где у вас есть #pragma
пакет), а затем выставить интерфейс через COM.
(Из любопытства, почему вы до сих пор работаете с VB6 вместо VB.NET?)
1
Существует не способ заставить VB6, чтобы не набивать UDT, подобная директиву #pragma пакета доступны во многом C/C++, но вы можете сделать это наоборот.
В соответствии с Q194609 Visual Basic использует выравнивание по 4 байтам и Visual C++ по умолчанию использует 8 байтов.
При использовании VB6 для вызова в DLL C, я использовал файлы заголовков MS «pshpack4.h» для обработки выравнивания, потому что различные компиляторы делают это по-разному, как показано в этом (довольно отредактированном) примере:
// this is in a header file called vbstruct.h ... # define VBSTRING char # define VBFIXEDSTRING char # define VBDATE double # define VBSINGLE float # ifdef _WIN32 # define VBLONG long # define VBINT short # else // and this was for 16bit code not 64bit!!!! # define VBLONG long # define VBINT int # endif ... # include "pshpack4.h" ... typedef struct VbComputerNameStruct { VBLONG sName; VBSTRING ComputerName[VB_COMPUTERNAME_LENGTH]; } VbComputerNameType; typedef struct VbNetwareLoginInfoStruct { VBLONG ObjectId; VBINT ObjectType; VBSTRING ObjectName[48]; } VbNetwareLoginInfoType; ... # include "poppack.h"
Смежные вопросы
- 1. Имеет ли C# эквивалент пакета #pragma в C++?
- 2. Имеет ли Clojure эквивалент пакета импорта Java. *?
- 3. gcc-эквивалент #pragma comment
- 4. Предупреждающий эквивалент #pragma poison
- 5. Использование пакета #pragma в классе
- 6. VB6 эквивалент string.IsNullOrEmpty
- 7. Имеет ли SQL Server эквивалент пакета PL/SQL Oracle?
- 8. Имеет ли VB6 выражения linq?
- 9. Имеет ли класс VB6 деструктор?
- 10. Of Type VB6 Эквивалент
- 11. Есть ли эквивалент C# функции Select() VB6?
- 12. Есть ли VB.NET-эквивалент управления UpDown VB6?
- 13. Application.Username VB6 Эквивалент
- 14. AllocHGlobal эквивалент в VB6
- 15. . Net эквивалент VB6 Recordset
- 16. Эквивалент Directory.CreateDirectory() в VB6
- 17. Эквивалент VLookup в VB6
- 18. Имеет ли Android эквивалент JPanel?
- 19. Имеет ли Python эквивалент 'switch'?
- 20. Имеет ли PHP эквивалент оператора || =?
- 21. Имеет ли объектный эквивалент get_or_insert
- 22. Имеет ли Mono эквивалент ILDASM?
- 23. Имеет ли NotifyIcon эквивалент MouseDown?
- 24. Имеет ли Java эквивалент StringStream?
- 25. Имеет ли jQuery эквивалент dojo.require?
- 26. Имеет ли powershell эквивалент popen?
- 27. Имеет ли VBScript эквивалент DateTime.TryParse?
- 28. Имеет ли Node.js эквивалент `open_basedir`?
- 29. Имеет ли Ruby/Rails эквивалент ++?
- 30. Имеет ли Vulkan эквивалент TransformFeedback
Возможно, немного поздно, но вы можете создать определение библиотеки типов UDT, которое задает размер минимального байта, и добавить это как ссылку. Я использовал редактор библиотеки типов, который поставляется с помощью «Advanced Visual Basic 6 Power Techniques for Everyday Programs» Мэтью Курленда. – 2011-10-29 00:02:53
@Mark: Это довольно опрятное решение. Всегда удивительно, сколько вы можете сделать с «обработанными вручную» TLB-файлами и VB6. – 2011-10-29 02:44:56