投稿日 | : 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の空白が埋め込まれる結果となります。この再配置による増加分により、
データのずれが発生するというわけです。
> メンバ毎にバラしてコピーしたら。ちゃんと表示出来るようになったのですが。
余白部を避けてコピーする事になるからです。