Can someone please explain the following Argument Exception : The structure must not be a value class to me please. It's being cause by the following line of code in my program:
Marshal.PtrToStructure(m.LParam, dbh);
given that dbh
is of type:
[StructLayout(LayoutKind.Sequential)]
public struct Device_Broadcast_Header
{
public int dbch_size;
public int dbch_devicetype;
public int dbch_reserved;
}
Thanks
You cannot call this particular Marshal.PtrToStructure
overload with a value type (i.e. a struct
).
If you call this overload you can receive an instance of your type back.
Sorry for not giving a code example, but here is a link that might help you.
Here is the key text from the above link:
The problem does nothing with the RegisterTraceGuids API.
According to the doc of Marshal.PtrToStructure(IntPtr, Object) http://msdn.microsoft.com/en-us/library/30ex8z62.aspx , it throws the ArgumentException that you saw when structure layout is not sequential or explicit or structure is a boxed value type.
In this case, the structure is declared as sequential, however, the elements in the array (traceGuidReg[i]) are boxed on the managed heap because of the array object, thus you got the error "the structure must not be a value class."
You would need to use the overload Marshal.PtrToStructure Method (IntPtr, Type) http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx and assign the result of PtrToStructure to the array elements.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With