elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Implementación de estructura C++ a C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Implementación de estructura C++ a C#  (Leído 1,968 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.809



Ver Perfil
Implementación de estructura C++ a C#
« en: 13 Diciembre 2015, 17:50 pm »

Hola

Publico el tema aquí, por que creo que me podrá servir de más ayuda.

Estoy tratando de implementar la estructura DEVMODE en C#:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspx
( y no me sirven las implementaciones de pinvoke.net u otros ejemplos online, ya que todas las que he visto hasta ahora son erroneas o desactualizadas en algún sentido )



He estado comparando los offsets en C++ y C#, en C++ con la macro offsetof y en C# con la función Marshal.OffsetOf, hasta llegar al miembro dmFields todo es correcto;
el problema que tengo, es que el offset del miembro dmColor es 60 en C++, mientras que en mi implementación es 68, esto quiere decir que mi implementación de los miembros de la primera union es incorrecta.

Según un experto en código no administrado, mi representación de las unions y el enfoque que le stoy dando es correcto, pero no debe ser del todo así, ya que las posiciones/offsets son distintas.

Código
  1.    [StructLayout(LayoutKind.Sequential)]
  2.    public struct DevMode {
  3.     private const int CchDeviceName = 32;
  4.     private const int CchFormName = 32;
  5.  
  6.     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CchDeviceName)]
  7.     public string DeviceName;
  8.     public short SpecVersion;
  9.     public short DriverVersion;
  10.     public short Size;
  11.     public short DriverExtra;
  12.     public DeviceModeFields Fields;
  13.     public UnionDevMode1 test1;
  14.     public short Color;
  15.     public short Duplex;
  16.     public short YResolution;
  17.     public short TTOption;
  18.     public short Collate;
  19.     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CchFormName)]
  20.     public string FormName;
  21.     public short LogPixels;
  22.     public int BitsPerPixel;
  23.     public int PixelsWidth;
  24.     public int PixelsHeight;
  25.     public UnionDevMode2 test2;
  26.     public int DisplayFrequency;
  27.     public int IcmMethod;
  28.     public int IcmIntent;
  29.     public int MediaType;
  30.     public int DitherType;
  31.     public int Reserved1;
  32.     public int Reserved2;
  33.     public int PanningWidth;
  34.     public int PanningHeight;
  35.    }
  36.  
  37.    [StructLayout(LayoutKind.Explicit)]
  38.    public struct UnionDevMode1 {
  39.     [FieldOffset(0)] public SubUnionDevMode1 subUnion1;
  40.     [FieldOffset(0)] public SubUnionDevMode2 subUnion2;
  41.    }
  42.  
  43.    [StructLayout(LayoutKind.Sequential)]
  44.    public struct SubUnionDevMode1 {
  45.     public short Orientation;
  46.     public short PaperSize;
  47.     public short PaperLength;
  48.     public short PaperWidth;
  49.     public short Scale;
  50.     public short Copies;
  51.     public short DefaultSource;
  52.     public short PrintQuality;
  53.    }
  54.  
  55.    [StructLayout(LayoutKind.Sequential)]
  56.    public struct SubUnionDevMode2 {
  57.     public Win32.Types.Point Position;
  58.     public DeviceModeDisplayOrientation DisplayOrientation;
  59.     public int DisplayFixedOutput;
  60.    }
  61.  
  62.    [StructLayout(LayoutKind.Explicit)]
  63.    public struct UnionDevMode2 {
  64.  
  65.     [FieldOffset(0)] public int DisplayFlags;
  66.     [FieldOffset(0)] public int Nup;
  67.  
  68.    }

El problema está en el miembro UnionDevMode1 , o al menos todo me indica eso, mejor dicho en alguno de los miembros de la estructura  SubUnionDevMode1 o  SubUnionDevMode2 , sin embargo, me he asegurado de que los types ocupan el mismo tamaño que en C++, vease:

POINTL = 8 bytes.
Win32.Types.Point = 8 bytes.

DeviceModeFields = int (4 bytes)
DeviceModeDisplayOrientation = int (4 bytes)

Teniendo esto en cuenta, ¿alguien es capaz de ver en lo que estoy fallando?.


« Última modificación: 13 Diciembre 2015, 18:43 pm por Eleкtro » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Implementación de estructura C++ a C#
« Respuesta #1 en: 13 Diciembre 2015, 18:14 pm »

¿Podría ser cosa del tamaño de 'DeviceModeFields'? ¿Tiene el tamaño correcto? O los miembros del union tienen el mismo offset en ambas implementaciones?


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.809



Ver Perfil
Re: Implementación de estructura C++ a C#
« Respuesta #2 en: 13 Diciembre 2015, 18:42 pm »

¿Podría ser cosa del tamaño de 'DeviceModeFields'? ¿Tiene el tamaño correcto?

Gracias ivancea. Si, lo añadi a mi post mientras escribias, es un tipo Int32 en .Net (4 bytes)

los miembros del union tienen el mismo offset en ambas implementaciones?

Lo he vuelto a revisar y resulta que no. Ha sido todo un despiste muy tonto, el código que puse era en C# pero solo lo puse por conveniencia ya que es un lenguaje más común, en realidad lo estoy tratando en Vb.Net y a diferencia del código de C# se me olvidó declarar los miembros de la estructura UnionDevMode1 de forma explícita, era secuencial así que SubUnionDevMode2 estaba en el offset 16 y no en el 0 donde debía estar.

Solucionado

saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Implementación de la ECC
Criptografía
C3.0 0 3,038 Último mensaje 30 Junio 2011, 02:04 am
por C3.0
Implementacion de Socket
.NET (C#, VB.NET, ASP)
rigorvzla 1 1,894 Último mensaje 28 Febrero 2019, 04:34 am
por ThunderCls
Implementacion Serializable
Java
Beginner Web 3 1,921 Último mensaje 7 Mayo 2019, 15:41 pm
por Beginner Web
Implementación de let en ES5?
Desarrollo Web
@XSStringManolo 6 2,974 Último mensaje 17 Diciembre 2019, 05:08 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines