2009-07-28 4 views
4

Может кто-нибудь объяснить следующее изложение аргумента: Структура не должна быть классом значений мне, пожалуйста. Это является причиной следующей строкой кода в моей программе:Аргумент Исключение, вызванное PtrToStructure

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

Благодарности

ответ

6

Вы не можете назвать эту конкретную Marshal.PtrToStructure перегрузки с типом значения (т.е. struct).

Если вы звоните this overload, вы можете получить экземпляр своего типа.

+0

Например: 'dbh = (Device_Broadcast_Header) Marshal.PtrToStructure (m.LParam, typeof (Device_Broadcast_Header));' – Pieniadz

2

Извините за не давая пример кода, но здесь это link, который может вам помочь.

Вот ключ текст из приведенной выше ссылке:

Проблема не делает ничего с RegisterTraceGuids API.

Согласно документу из Marshal.PtrToStructure (IntPtr, Object) http://msdn.microsoft.com/en-us/library/30ex8z62.aspx , он бросает ArgumentException, что вы видели, когда структура макета не последовательным или явной или структура коробочный тип значения.

В этом случае структура объявлен как последовательный, однако, элементы в массиве (traceGuidReg [я]) зажаты на управляемой куче из объекта массива , таким образом, вы получили ошибку «структура не должна быть классом значений».

Вы должны были бы использовать перегрузку Marshal.PtrToStructure метод (IntPtr, тип) http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx и присвоить результат PtrToStructure к элементам массива.

+0

Спасибо Jas Я как-то ударил решение перед тем, как вы ответили и на этом сайте, но можете ли вы объяснить, что означал этот парень, когда элементы помещались в управляемую кучу? Я думаю, что у меня есть справедливое представление, что это может означать, но я хотел бы уточнить. –

0
[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); 
+0

Код отвечает только на arent, так как он не предоставляет много информации для будущих читателей, пожалуйста, предоставьте некоторое объяснение тому, что вы написали – WhatsThePoint

Смежные вопросы