VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2005/01/24(Mon) 22:28
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe^7: 構造体のビットマップを貼り付ける

ユーザー定義型の定義、CopyMemory APIの定義等も併記して、
こちらで現象を再現できるコードを提示してもらえると、ありがたかったです。

>  BITMAPFILEHEADER構造体(BFI)の中のLong型が前2バイトと後2バイトが
> 入れ替わっている様なのですね。しかしBITMAPINFOHEADER構造体(BHI)の
> 中のLong型はそのままのようです。

それぞれの構造体は……こういう並びになっているのですね。

[BITMAPINFOHEADER 構造体]
hhttp://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp

[BITMAPFILEHEADER 構造体]
hhttp://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp


現象を再現できるコードが無いので、そちらの状況を確認することはできませんが、
おそらくそれは、アライメントの問題から、「たまたま入れ替わっている様に見える」
だけでは無いでしょうか。

VB6 では、ユーザー定義型のメンバが 32bit境界上にまたがる事が無い様に
メモリ上に配置されます。たとえば、下記を試してみてください。

================================
Option Explicit

Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef dest As Any, ByRef src As Any, ByVal L As Long)

Private Type Test1
    A As Integer
    B As Long
    C As Integer
End Type

Private Type Test2
    A As Integer
    B As Integer
    C As Long
End Type

Private Sub Form_Load()
    Dim X As Test1, Y As Test2
    Dim B() As Byte

    X.A = &H1122
    X.B = &H33445566
    X.C = &H7788

    Y.A = &H1122
    Y.B = &H3344
    Y.C = &H55667788

    ReDim B(LenB(X) - 1)   'Len関数ではなく、LenBである事に注意!
    RtlMoveMemory B(0), X, LenB(X)
    Dump B    '→ 22 11 00 00 66 55 44 33 88 77 00 00 ← "00" が含まれる!

    ReDim B(LenB(Y) - 1)
    RtlMoveMemory B(0), Y, LenB(Y)
    Dump B    '→ 22 11 44 33 88 77 66 55 ← こちらは "00" が含まれない
End Sub

Private Sub Dump(ByRef Data() As Byte)
    Dim V As Variant
    For Each V In Data
        Debug.Print Right("0" & Hex(V), 2); " ";
    Next
    Debug.Print
End Sub
================================

Test1型とTest2型は、共に Integer×2 と Long をメンバに持つユーザー定義型ですが、
両者はメンバの配置順が異なっています。
(Test1型の配置は、BITMAPFILEHEADER 構造体の先頭部分と同じ定義にしてあります)

各メンバは「32bit単位で再配置される」ため、Test1型の方は、A As Integer の後に、
16bitの空白が埋め込まれる結果となります。この再配置による増加分により、
データのずれが発生するというわけです。


> メンバ毎にバラしてコピーしたら。ちゃんと表示出来るようになったのですが。
余白部を避けてコピーする事になるからです。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -