4

私は独自のバイナリプロトコルを処理する必要があるTCP/IPクライアントを開発しています。プロトコルヘッダーを表すためにユーザー定義型を使用し、UDTとバイト配列との間でデータをシャッフルするためにCopyMemoryを使用することを検討していました。ただし、VB6はユーザー定義型を整列させるためにパディングバイトを追加しているようです。#pragma pack多くのC/C ++コンパイラで利用可能なディレクティブと同様に、VB6にUDTをパディングしないように強制する方法はありますか?おそらく、コンパイラに渡される特別なスイッチですか?

4

2 に答える 2

5

いいえ。

最善の策は、CまたはC ++(ある場合#pragma pack)で低レベルのコードを記述してから、COMを介してインターフェイスを公開することです。

于 2008-09-27T05:20:22.807 に答える
1

多くの C/C++ コンパイラで使用できる #pragma pack ディレクティブと同様に、VB6 で UDT をパディングしないようにする方法はありませんが、その逆は可能です。

Q194609 によると、Visual Basic は 4 バイトのアラインメントを使用し、Visual C++ はデフォルトで 8 バイトを使用します。

VB6 を使用して C DLL を呼び出す場合、MS の "pshpack4.h" ヘッダー ファイルを使用して位置合わせを処理しました。これは、次の (かなり編集された) 例に示すように、さまざまなコンパイラがさまざまな方法でこれを行うためです。

// これは vbstruct.h というヘッダー ファイルにあります
...

# VBSTRING 文字を定義
# VBFIXEDSTRING 文字を定義
# VBDATE double を定義
# VBSINGLE float を定義

# ifdef _WIN32
# VBLONG long を定義
# VBINT short を定義
# else // そして、これは 64 ビットではなく 16 ビット コード用でした!!!!
# VBLONG long を定義
# VBINT int を定義
# endif
...

# インクルード "pshpack4.h"
...

typedef 構造体 VbComputerNameStruct
    {
    VBLONG sName;
    VBSTRING コンピューター名[VB_COMPUTERNAME_LENGTH];
    } VbComputerNameType;


typedef struct VbNetwareLoginInfoStruct
    {
    VBLONG ObjectId;
    VBINT オブジェクト タイプ。
    VBSTRING ObjectName[48];
    } VbNetwareLoginInfoType;
...

# インクルード "poppack.h"
于 2008-09-27T05:37:41.127 に答える