Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Miseryk en 26 Febrero 2014, 15:23 PM

Título: [AYUDA] C# punteros
Publicado por: Miseryk en 26 Febrero 2014, 15:23 PM
Hola a todos, estaba tratando de pasar un código de c++ a c#, busqué en internet la posible solución, aún así no pude resolverlo, es el siguiente:

Edit:
Por cierto, estoy utilizando ésto:
Código (csharp) [Seleccionar]

    using DWORD = UInt32;
    using HRESULT = Int32;
    using WORD = UInt16;
    using ULONG = UInt32;
    using HSERVICE = UInt16;
    using LPVOID = IntPtr;
    using LPBYTE = IntPtr;
    using REQUESTID = UInt32;
    using USHORT = UInt16;
    using BOOL = UInt32;
    using LPSTR = IntPtr;
    using BYTE = Byte;
    using CHAR = Byte;
    using DOUBLE = Double;
    using FLOAT = Single;
    using LONG = UInt32;
    using LONGLONG = UInt64;
    using SHORT = Int16;
    using UINT = UInt32;
    using ULONGLONG = UInt64;


Código (csharp) [Seleccionar]

[StructLayout(LayoutKind.Explicit, Size = 268, CharSet = CharSet.Ansi)]
   public unsafe struct WFSIPMIMAGEREQUEST2
   {
       [FieldOffset(0)]public WORD wImageSource;
       [FieldOffset(2)]public WORD wImageType;
       [FieldOffset(4)]public WORD wImageColorFormat;
       [FieldOffset(6)]public WORD wImageScanColor;
       [FieldOffset(8)]public LPVOID lpszImagePath;
       [FieldOffset(12)]public fixed char Value[256];
   }

[StructLayout(LayoutKind.Explicit, Size = 276, CharSet = CharSet.Ansi)]
   public unsafe struct WFSIPMREADIMAGEIN2
   {
       [FieldOffset(0)]public USHORT usMediaID;
       [FieldOffset(2)]public WORD wCodelineFormat;
       [FieldOffset(4)]public WFSIPMIMAGEREQUEST2** lppImage;
   }


A WFSIPMREADIMAGEIN2 le puse 276 porque está en offset 4 + 268 de la otra estructura = 272 + 4 de otro index pero a null como terminador de los índices.

Por el cual el index 0 tendría toda la estructura y el index 1 sería igual a null.

Código (csharp) [Seleccionar]

WFSIPMREADIMAGEIN2 lpReadImageIn = new WFSIPMREADIMAGEIN2();


pero cuando hago:

Código (csharp) [Seleccionar]

lpReadImageIn.lppImage[0]->wImageSource = 1;


Me muestra como mensaje de error: "Object reference not set to an instance of an object."

Cualquier aporte sería de gran ayuda, gracias.
Título: Re: [AYUDA] C# punteros
Publicado por: kub0x en 28 Febrero 2014, 21:06 PM
Buenas Miseryk,

revisando por encima tu código me he dado cuenta de un par de cosas:

Cita de: Miseryk en 26 Febrero 2014, 15:23 PM
Código (csharp) [Seleccionar]

WFSIPMREADIMAGEIN2 lpReadImageIn = new WFSIPMREADIMAGEIN2();


Ahí creas correctamente la instancia de la estructura convertida a C#.

Cita de: Miseryk en 26 Febrero 2014, 15:23 PM
Código (csharp) [Seleccionar]

lpReadImageIn.lppImage[0]->wImageSource = 1;


Lo que sucede es que intentas asignar el valor '1' al campo lppImage, campo el cual no ha sido previamente instanciado por lo que no apunta a una referencia válida de instancia u objeto. Resumiendo, que el campo lppImage no apunta a ningún lado, está vacio (puntero a null).

Lo podrías solucionar instanciado dicho campo de la estructura:

Código (csharp) [Seleccionar]

lpReadImageIn.lppImage[0] = new WFSIPMIMAGEREQUEST2();


La próxima vez ten más cuidado  ;)

Saludos!