我正在開發一個必須處理專有二進制協議的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. #pragma pack(16)和#pragma pack(8)的效果總是一樣嗎?
- 2. C++ #pragma pack
- 3. #C++中的#pragma pack
- 4. Valgrind和「#pragma pack(2)」
- 5. 使用類#pragma pack
- 6. iphone上的pragma pack(push)
- 7. 是否有一個VB.NET等效的VB6 Support.TabLayout方法?
- 8. #pragma pack()調用有什麼作用?
- 9. 什麼禁用#pragma pack(push)?
- 10. 如何追溯#pragma pack?
- 11. 類型VB6等效
- 12. 是否有:disable_with等效link_to_remote?
- 13. http Pragma的有效值是什麼
- 14. AllocHGlobal VB6中的等效
- 15. #使用GCC的#pragma pack(顯示)
- 16. 在wxPython中等效於SWT的.pack()?
- 17. 是否有Perl的__DATA__段的C++等效(或等效技術)?
- 18. Service Pack安裝錯誤VB6
- 19. 是否有與CoCreateInstanceEx等效的.NET?
- 20. 是否有與C#7.0等效的Microsoft.Net.Compilers?
- 21. SQL Server中是否有等效的SQL_CALC_FOUND_ROWS?
- 22. .net中是否有等效的EOPAGE?
- 23. 是否有iOS的等效appendBezierPathWithArcWithCenter
- 24. 是否有與nodejs等效的Jack?
- 25. AS3 - 是否有與BitmapData.encode()等效的decode()?
- 26. 在C++中是否有等效的str_replace?
- 27. 什麼是網絡預設電臺'的#pragma pack`呢?
- 28. 是否有C#等價於VB6的Choose()函數?
- 29. Telnet中是否有$ {SSH_CONNECTION %% *}等效項?
- 30. 是否有任何jQuery.ajaxSuccess等效於AngularJS
現在可能有點遲了,但是您可以創建一個指定最小字節大小的UDT的類型庫定義,並將其添加爲參考。我使用了由Matthew Curland提供的「適用於日常程序的高級Visual Basic 6 Power Techniques」的類型庫編輯器。 – 2011-10-29 00:02:53
@Mark:無論如何,這都是一個非常好的解決方案。用「手工製作」的TLB文件和VB6可以做多少總是令人驚訝。 – 2011-10-29 02:44:56