5

誰かが次の引数の例外を説明できますか:構造は私にとって値クラスであってはなりません。これは、私のプログラムの次のコード行が原因です。

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;
}

ありがとう

4

3 に答える 3

7

この特定Marshal.PtrToStructureのオーバーロードを値型 (つまり a struct) で呼び出すことはできません。

このオーバーロードを呼び出すと、型のインスタンスを受け取ることができます。

于 2009-07-28T18:02:40.630 に答える
2

コード例を提供できなくて申し訳ありませんが、ここに役立つリンクがあります。

上記のリンクの重要なテキストは次のとおりです。

この問題は、RegisterTraceGuids API では何もしません。

Marshal.PtrToStructure(IntPtr, Object) http://msdn.microsoft.com/en-us/library/30ex8z62.aspxのドキュメントによると、 構造レイアウトがシーケンシャルまたは明示的または構造ではない場合に見た ArgumentException をスローしますボックス化された値の型です。

この場合、構造はシーケンシャルとして宣言されますが、配列内の要素 (traceGuidReg[i]) は、配列オブジェクトのためにマネージ ヒープにボックス化されるため、「構造は値クラスであってはなりません」というエラーが表示されます。 ."

オーバーロード Marshal.PtrToStructure Method (IntPtr, Type) http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx を使用し、PtrToStructure の結果を配列要素に割り当てる必要があります。

于 2009-07-28T18:00:49.683 に答える