我正在开发一个必须处理专有二进制协议的TCP/IP客户端。我正在考虑使用用户定义的类型来表示协议头,并使用CopyMemory来将数据混合到UDT和字节数组中。但是,看起来VB6添加了填充字节来对齐用户定义的类型。有什么办法可以强制VB6不填充UDT,类似于许多C/C++编译器中可用的#pragma pack指令?也许一个特殊的开关传递给编译器?VB6是否有等效的#pragma pack?
3
A
回答
4
号
最好的办法是写在C或C低级代码++(其中你有#pragma
包),然后通过COM公开接口。
(出于好奇,你为什么还用VB6,而不是VB.NET工作?)
1
没有任何办法强迫VB6不垫UDT的,类似的#pragma pack指令可以在许多C/C++编译器,但你可以用相反的方法来完成。
根据Q194609 Visual Basic使用4字节对齐方式和 Visual C++默认使用8字节。
当使用VB6调用C DLL时,我使用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 pack
- 2. #C++中的#pragma pack
- 3. Valgrind和“#pragma pack(2)”
- 4. iphone上的pragma pack(push)
- 5. Pragma Pack忽略和__attribute__((aligned(2),packed));没有任何效果
- 6. 如何追溯#pragma pack?
- 7. 什么禁用#pragma pack(push)?
- 8. 是否有:disable_with等效link_to_remote?
- 9. AllocHGlobal VB6中的等效
- 10. 在wxPython中等效于SWT的.pack()?
- 11. Service Pack安装错误VB6
- 12. 是否有与CoCreateInstanceEx等效的.NET?
- 13. 是否有与nodejs等效的Jack?
- 14. 是否有与C#7.0等效的Microsoft.Net.Compilers?
- 15. 在C++中是否有等效的str_replace?
- 16. 什么是网络预设电台'的#pragma pack`呢?
- 17. 是否有C#等价于VB6的Choose()函数?
- 18. * nix上是否有SQLCMD等效项?
- 19. 是否有任何jQuery.ajaxSuccess等效于AngularJS
- 20. 是否有一个JProfiler等效于.NET?
- 21. gcc中的#pragma等价物是什么?
- 22. DriveApp.getFiles()是否与DocsList.getFiles()等效?
- 23. 与.pack()是无效的语法
- 24. 在c#中等效于vb6的kill语句是什么?
- 25. 在VB.net中VB6函数AscB等效
- 26. 等效VB6.TwipsPerPixelX在vb.net不使用Microsoft.Visualbasic.Compatibility.dll
- 27. VB.Net滤波器阵列等效于VB6
- 28. Vb6具有等效原生错误的Adodb错误代码
- 29. 是否有网络发送或Msg.exe等效IOS等移动platorms?
- 30. 是否有等效的ApplicationController,但是对于活动作业?
现在可能有点迟了,但是您可以创建一个指定最小字节大小的UDT的类型库定义,并将其添加为参考。我使用了由Matthew Curland提供的“适用于日常程序的高级Visual Basic 6 Power Techniques”的类型库编辑器。 – 2011-10-29 00:02:53
@Mark:无论如何,这都是一个非常好的解决方案。用“手工制作”的TLB文件和VB6可以做多少总是令人惊讶。 – 2011-10-29 02:44:56