PtrToStructure によってスローされた引数例外
-
20-09-2019 - |
質問
誰かが次の引数の例外を説明してください: 構造体は値クラスであってはなりません 私にお願いします。私のプログラム内の次のコード行が原因です。
Marshal.PtrToStructure(m.LParam, dbh);
とすれば dbh
タイプは次のとおりです:
[StructLayout(LayoutKind.Sequential)]
public struct Device_Broadcast_Header
{
public int dbch_size;
public int dbch_devicetype;
public int dbch_reserved;
}
ありがとう
解決
これを特別と呼ぶことはできません Marshal.PtrToStructure
値型を使用したオーバーロード (つまり、ある struct
).
電話したら この過負荷 あなたのタイプのインスタンスを受け取ることができます。
他のヒント
コード例を示さなくて申し訳ありませんが、これは次のとおりです リンク それはあなたを助けるかもしれません。
上記のリンクからの重要なテキストは次のとおりです。
この問題は、RegisterTraceGuids APIで何もしません。
Marshal.PtrtTOSTRUCTURE(INTPTR、オブジェクト)のドキュメントによると http://msdn.microsoft.com/en-us/library/30ex8z62.aspx、構造レイアウトが順次または明示的でない場合、または構造が箱入り値のタイプである場合に見たArgumentExceptionをスローします。
この場合、構造はシーケンシャルとして宣言されますが、配列の要素(traceGuidreg [i])は、配列オブジェクトのためにマネージドヒープにボックス化されているため、エラーが得られます。 。」
オーバーロードMarshal.PtrToStructureメソッド(INTPTR、タイプ)を使用する必要があります http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspxptrtToStructureの結果を配列要素に割り当てます。
[StructLayout(LayoutKind.Sequential)]
public class Device_Broadcast_Header_Wrapper{
public Device_Broadcast_Header Header
}
Device_Broadcast_Header_Wrapper wapper = new Device_Broadcast_Header_Wrapper();
Marshal.PtrToStructure(m.LParam, wapper);