質問させてください。
私はVB6では、タスク間でメモリを共有する時にマップファイルを使用していました。
同じ事をVB.netでやろうとしているのですが、
構造体をRtlMoveMemoryにてマップファイルに渡そうとすると、
マーシャリングできない、というエラーが出ます。
//////////////// Code /////////////////////////////
Imports System.Runtime.InteropServices
Public Class Test
''メモリコピー関数
''As Anyだと怒られるので、渡す型に変えました。
Declare Sub MemCopy Lib "kernel32" Alias "RtlMoveMemory" (ByRef hpvDest As STRC_TEST, ByVal hpvSource As Integer, ByVal cbCopy As Integer)
<StructLayout(LayoutKind.Sequential)> Structure STRC_TEST
Dim A As Long
Dim B() As Integer
Public Sub Initialize()
ReDim B(3)
End Sub
End Structure
Private Sub fncTest()
Dim Test As STRC_TEST
Dim Test2 As STRC_TEST
Dim fhdTest As Integer ''ファイルハンドル
Dim mhdTest As Integer ''作成したマップファイルハンドル
Dim pntAdrTest As Integer ''マップファイルのポインタ
Dim opnMapTest As Integer ''オープンしたマップファイルのハンドル
''構造体内の配列の初期化
Test.Initialize()
''値をセット
Test.A = 1
Test.B(0) = 2
Test.B(1) = 3
Test.B(2) = 4
Test.B(3) = 5
''ファイル作成
intFn = FreeFile()
FileOpen(intFn, "Test.tmp", OpenMode.Binary)
''ファイルに上の構造体を書き込み
FilePut(intFn, Test)
''ファイルを閉じる
FileClose(intFn)
''マップファイル作成
fhdTest = CreateFile関数にて"Test.tmp"を開く
mhdTest = CreateFileMapping関数にて"Test.Map"を作成
opnMapTest = OpenFileMapping関数にて"Test.Map"をオープン
pntAdrTest = MapViewOfFile関数にてTest.Mapのアドレスを取得
''pntAdrTestからの24バイトには、上のTest構造体の値が入っている
''はずなので、RtlMoveMemoryにてTest2構造体にムーブメモリーしたい。
Call MemCopy(Test2 , pntAdrTest , 24)
''↑ここでエラーが出ます
型 STRC_TEST のフィールド B をマーシャリングできません : この型は構造体フィールドとして、マーシャリングできません。
''以下略
End Class
マーシャリングについていろいろとヘルプを見たりしましたが、
イマイチよく理解できません・・・
VB.netにて、「構造体をメモリコピーにてマップファイルに渡す」方法をソースコード付きで教えていただけないでしょうか?
> <StructLayout(LayoutKind.Sequential)> Structure STRC_TEST
> Dim A As Long
> Dim B() As Integer
> Public Sub Initialize()
> ReDim B(3)
> End Sub
> End Structure
これだと、B() が動的なので、マーシャリング時にサイズが不明ですね。
あぁんさん
<VBFixedArray(3), MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)>
とする事で解決できました。
ありがとうございます。
ツイート | ![]() |