DOBON.NET DOBON.NETプログラミング掲示板過去ログ

APIのパラメータについて

分類:[.NET]


API関数のパラメータに構造体の渡したのですが
構造体のメンバに構造体の配列が有ると
エラーになり渡すことが出来ません。
どなたか教えて下さい。
宜しくお願いします。
処理は以下の様に行っています。

<StructLayout(LayoutKind.Sequential)> _
Public Structure POINT2
Dim x as integer
  <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim z() As Short
End Structure

<StructLayout(LayoutKind.Sequential)> _
Public Structure POINT
Dim xx As Integer
Dim zx As POINT2
End Structure

<StructLayout(LayoutKind.Sequential)> _
Public Structure POINT3
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim kkk() As POINT
End Structure

Public Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory"
(ByRef dest As POINT3, ByVal numBytes As Integer)

Dim str As POINT3
ZeroMemory(str, Len(str))

以上
根本的な回答にはなっていませんが。。。

ZeroMemoryはポインタを辿ってまでクリアしませんから、
POINT.xxやPOINT2.xは0になりません。
(むしろこれではメモリーリークの原因になるような気が。)
配下のメンバーを全て0にするメソッドなりを作成されるほうが
ずっと簡単・安全で良いのでは?

それでも、POINT3.kkk()をNothingにしたいなら
Public Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory"
(ByRef dest As Object, ByVal numBytes As Integer)
と、As Objectにするとか。
ピラルクさん回答ありがとうございます。
ZeroMemoryの引数をObjectにしたら
処理が流れるようになりました。

API関数の引数が構造体で
メンバに構造体の配列があるのデータは
使えないのでしょうか?
"この型は構造体フィールドとして、マーシャリングできません"
とエラーが表示されるのですが
マーシャリングについて知っていたら教えて下さい。

DOBON.NET | プログラミング道 | プログラミング掲示板