[AYUDA] C# punteros

Iniciado por Miseryk, 26 Febrero 2014, 15:23 PM

0 Miembros y 1 Visitante están viendo este tema.

Miseryk

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.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

kub0x

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!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate