Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Argument Exception thrown by PtrToStructure

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

like image 231
Dark Star1 Avatar asked Jul 28 '09 17:07

Dark Star1


2 Answers

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.

like image 147
Andrew Hare Avatar answered Nov 18 '22 14:11

Andrew Hare


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.

like image 31
Jason Evans Avatar answered Nov 18 '22 13:11

Jason Evans