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)
| | |-+  Offests de los miembros de la estructura DEVMODE
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Offests de los miembros de la estructura DEVMODE  (Leído 2,015 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.822



Ver Perfil
Offests de los miembros de la estructura DEVMODE
« en: 13 Diciembre 2015, 15:56 pm »

Hola

Me gustaría saber si alguien con experiencia en C++ podría indicarme los offests de los miembros de la estructura DEVMODE:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspx

Esto es por que estoy tratanto de trasladar las unions de dicha estructura a .Net, pero necesito saber los offsets de los miembros en C++ para comparar el resto de miembros, ya que algo hice mal, probablemente el tamaño de alguno de mis miembros declarados sea incorrecto en comparación con el tamaño definido en la estructura de C++.

Me han comentado que esto se hace con la macro offsetof:

Creo que no pido mucho, debe ser una cosa sencilla para quien maneje C++, pero si me equivoco disculpen y diganme más o menos como podría hacerlo yo mismo...

Saludos


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

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Offests de los miembros de la estructura DEVMODE
« Respuesta #1 en: 13 Diciembre 2015, 16:06 pm »

En C#

Código
  1. Structure DEVMODE
  2.    Public Const CCHDEVICENAME As Integer = 32
  3.    Public Const CCHFORMNAME As Integer = 32
  4.  
  5.    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHDEVICENAME)> _
  6.    <System.Runtime.InteropServices.FieldOffset(0)> _
  7.    Public dmDeviceName As String
  8.    <System.Runtime.InteropServices.FieldOffset(32)> _
  9.    Public dmSpecVersion As Int16
  10.    <System.Runtime.InteropServices.FieldOffset(34)> _
  11.    Public dmDriverVersion As Int16
  12.    <System.Runtime.InteropServices.FieldOffset(36)> _
  13.    Public dmSize As Int16
  14.    <System.Runtime.InteropServices.FieldOffset(38)> _
  15.    Public dmDriverExtra As Int16
  16.    <System.Runtime.InteropServices.FieldOffset(40)> _
  17.    Public dmFields As DM
  18.    <System.Runtime.InteropServices.FieldOffset(44)> _
  19.    Private dmOrientation As Int16
  20.    <System.Runtime.InteropServices.FieldOffset(46)> _
  21.    Private dmPaperSize As Int16
  22.    <System.Runtime.InteropServices.FieldOffset(48)> _
  23.    Private dmPaperLength As Int16
  24.    <System.Runtime.InteropServices.FieldOffset(50)> _
  25.    Private dmPaperWidth As Int16
  26.    <System.Runtime.InteropServices.FieldOffset(52)> _
  27.    Public dmScale As Int16
  28.    <System.Runtime.InteropServices.FieldOffset(54)> _
  29.    Public dmCopies As Int16
  30.    <System.Runtime.InteropServices.FieldOffset(56)> _
  31.    Private dmDefaultSource As Int16
  32.    <System.Runtime.InteropServices.FieldOffset(58)> _
  33.    Private dmPrintQuality As Int16
  34.    <System.Runtime.InteropServices.FieldOffset(44)> _
  35.    Public dmPosition As POINTL
  36.    <System.Runtime.InteropServices.FieldOffset(52)> _
  37.    Public dmDisplayOrientation As Int32
  38.    <System.Runtime.InteropServices.FieldOffset(56)> _
  39.    Public dmDisplayFixedOutput As Int32
  40.    <System.Runtime.InteropServices.FieldOffset(60)> _
  41.    Public dmColor As Short
  42.    <System.Runtime.InteropServices.FieldOffset(62)> _
  43.    Public dmDuplex As Short
  44.    <System.Runtime.InteropServices.FieldOffset(64)> _
  45.    Public dmYResolution As Short
  46.    <System.Runtime.InteropServices.FieldOffset(66)> _
  47.    Public dmTTOption As Short
  48.    <System.Runtime.InteropServices.FieldOffset(68)> _
  49.    Public dmCollate As Short
  50.    <System.Runtime.InteropServices.FieldOffset(72)> _
  51.    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHFORMNAME)> _
  52.    Public dmFormName As String
  53.    <System.Runtime.InteropServices.FieldOffset(102)> _
  54.    Public dmLogPixels As Int16
  55.    <System.Runtime.InteropServices.FieldOffset(104)> _
  56.    Public dmBitsPerPel As Int32
  57.    <System.Runtime.InteropServices.FieldOffset(108)> _
  58.    Public dmPelsWidth As Int32
  59.    <System.Runtime.InteropServices.FieldOffset(112)> _
  60.    Public dmPelsHeight As Int32
  61.    <System.Runtime.InteropServices.FieldOffset(116)> _
  62.    Public dmDisplayFlags As Int32
  63.    <System.Runtime.InteropServices.FieldOffset(116)> _
  64.    Public dmNup As Int32
  65.    <System.Runtime.InteropServices.FieldOffset(120)> _
  66.    Public dmDisplayFrequency As Int32
  67. End Structurecode

ó:

Código
  1. [/ [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
  2.    struct DEVMODE
  3.    {
  4.        public const int CCHDEVICENAME = 32;
  5.        public const int CCHFORMNAME = 32;
  6.  
  7.        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
  8.        [System.Runtime.InteropServices.FieldOffset(0)]
  9.        public string dmDeviceName;
  10.        [System.Runtime.InteropServices.FieldOffset(32)]
  11.        public Int16 dmSpecVersion;
  12.        [System.Runtime.InteropServices.FieldOffset(34)]
  13.        public Int16 dmDriverVersion;
  14.        [System.Runtime.InteropServices.FieldOffset(36)]
  15.        public Int16 dmSize;
  16.        [System.Runtime.InteropServices.FieldOffset(38)]
  17.        public Int16 dmDriverExtra;
  18.        [System.Runtime.InteropServices.FieldOffset(40)]
  19.        public DM dmFields;
  20.  
  21.        [System.Runtime.InteropServices.FieldOffset(44)]
  22.        Int16 dmOrientation;
  23.        [System.Runtime.InteropServices.FieldOffset(46)]
  24.        Int16 dmPaperSize;
  25.        [System.Runtime.InteropServices.FieldOffset(48)]
  26.        Int16 dmPaperLength;
  27.        [System.Runtime.InteropServices.FieldOffset(50)]
  28.        Int16 dmPaperWidth;
  29.        [System.Runtime.InteropServices.FieldOffset(52)]
  30.        Int16 dmScale;
  31.        [System.Runtime.InteropServices.FieldOffset(54)]
  32.        Int16 dmCopies;
  33.        [System.Runtime.InteropServices.FieldOffset(56)]
  34.        Int16 dmDefaultSource;
  35.        [System.Runtime.InteropServices.FieldOffset(58)]
  36.        Int16 dmPrintQuality;
  37.  
  38.        [System.Runtime.InteropServices.FieldOffset(44)]
  39.        public POINTL dmPosition;
  40.        [System.Runtime.InteropServices.FieldOffset(52)]
  41.        public Int32 dmDisplayOrientation;
  42.        [System.Runtime.InteropServices.FieldOffset(56)]
  43.        public Int32 dmDisplayFixedOutput;
  44.  
  45.        [System.Runtime.InteropServices.FieldOffset(60)]
  46.        public short dmColor;
  47.        [System.Runtime.InteropServices.FieldOffset(62)]
  48.        public short dmDuplex;
  49.        [System.Runtime.InteropServices.FieldOffset(64)]
  50.        public short dmYResolution;
  51.        [System.Runtime.InteropServices.FieldOffset(66)]
  52.        public short dmTTOption;
  53.        [System.Runtime.InteropServices.FieldOffset(68)]
  54.        public short dmCollate;
  55.        [System.Runtime.InteropServices.FieldOffset(72)]
  56.        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
  57.        public string dmFormName;
  58.        [System.Runtime.InteropServices.FieldOffset(102)]
  59.        public Int16 dmLogPixels;
  60.        [System.Runtime.InteropServices.FieldOffset(104)]
  61.        public Int32 dmBitsPerPel;
  62.        [System.Runtime.InteropServices.FieldOffset(108)]
  63.        public Int32 dmPelsWidth;
  64.        [System.Runtime.InteropServices.FieldOffset(112)]
  65.        public Int32 dmPelsHeight;
  66.        [System.Runtime.InteropServices.FieldOffset(116)]
  67.        public Int32 dmDisplayFlags;
  68.        [System.Runtime.InteropServices.FieldOffset(116)]
  69.        public Int32 dmNup;
  70.        [System.Runtime.InteropServices.FieldOffset(120)]
  71.        public Int32 dmDisplayFrequency;
  72.    }
  73. code]


« Última modificación: 13 Diciembre 2015, 16:10 pm por fary » En línea

Un byte a la izquierda.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.822



Ver Perfil
Re: Offests de los miembros de la estructura DEVMODE
« Respuesta #2 en: 13 Diciembre 2015, 16:14 pm »

fary, gracias por contestar pero esa definición es erronea. Sigo necesitando los offsets en C++.

¿Ese código lo sacaste de pinvoke.net, verdad?. Ya la probé recientemente, pero ni siquiere tiene los unions, de hecho, el autor ni siquiera debería haber declarado los miembros de forma explícita.

Debería ser más bien así:
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. }

... Solo que algún miembro de mis declaraciones tiene un tamaño/posición incorrecto, necesito comparar los offsets.

Estoy descargando la IDE code::blocks, pero nunca hice esto en C++, de hecho practicamente he manejado C++ solo un par de veces, ya veremos si lo consigo averiguar...

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

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Offests de los miembros de la estructura DEVMODE
« Respuesta #3 en: 13 Diciembre 2015, 16:22 pm »

En realidad no tiene que llevar los union, fijate en este mismo ejemplo de la msdn:

https://msdn.microsoft.com/en-us/library/aa251430(v=vs.60).aspx

Código
  1. typedef struct _devicemode {    /* dvmd */
  2.    TCHAR  dmDeviceName[32];
  3.    WORD   dmSpecVersion;
  4.    WORD   dmDriverVersion;
  5.    WORD   dmSize;
  6.    WORD   dmDriverExtra;
  7.    DWORD  dmFields;
  8.    short  dmOrientation;
  9.    short  dmPaperSize;
  10.    short  dmPaperLength;
  11.    short  dmPaperWidth;
  12.    short  dmScale;
  13.    short  dmCopies;
  14.    short  dmDefaultSource;
  15.    short  dmPrintQuality;
  16.    short  dmColor;
  17.    short  dmDuplex;
  18.    short  dmYResolution;
  19.    short  dmTTOption;
  20.    short  dmCollate;
  21.    TCHAR  dmFormName[32];
  22.    WORD   dmUnusedPadding;
  23.    USHORT dmBitsPerPel;
  24.    DWORD  dmPelsWidth;
  25.    DWORD  dmPelsHeight;
  26.    DWORD  dmDisplayFlags;
  27.    DWORD  dmDisplayFrequency;
  28. } DEVMODE;

WORD = 2 bytes
DWORD = 4 bytes
TCHAR [32] = 32 bytes
USHORT = 2 bytes
short = 2 bytes

Espero que ahora si lo puedas resolver.
En línea

Un byte a la izquierda.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.822



Ver Perfil
Re: Offests de los miembros de la estructura DEVMODE
« Respuesta #4 en: 13 Diciembre 2015, 17:21 pm »

Pero claramente la definición actual tiene más miembros.
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspx

Gracias por tu tiempo.

Lo estoy comprobando con este código de ejemplo que encontré:
http://www.cplusplus.com/reference/cstddef/offsetof/

Código
  1. #include <windows.h>
  2.  
  3. int main ()
  4. {
  5.  printf ("offsetof is %d\n",(int)offsetof(DEVMODE,dmColor));
  6.  return 0;
  7. }

Lo único tedioso o incómodo es que al no haber Reflection en C++ voy comprobando miembro por miembro, uno por uno, jeje. Aunque tampoco se si habrá alguna otra posible manera de enumerar los miembros de una estructura.

PD: En estos momentos maldigo haber capado mi VS de las características y el compiler de C++, no me gustan nada las IDEs alternativas de C++.

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Control de accesos a Miembros en C#
.NET (C#, VB.NET, ASP)
CATBro 0 2,234 Último mensaje 29 Enero 2012, 23:14 pm
por CATBro
Plantilla actualizable de miembros en una web
Desarrollo Web
as if 4 2,858 Último mensaje 20 Junio 2013, 18:57 pm
por engel lex
Acceder a miembros de objetos
Programación C/C++
acega 1 1,681 Último mensaje 9 Octubre 2013, 18:34 pm
por vangodp
Pointers & Offests MHS5
Ingeniería Inversa
calk9 6 3,763 Último mensaje 11 Noviembre 2013, 18:16 pm
por calk9
Tamaño de estructura varia con el orden de sus miembros
Programación C/C++
SebaC 2 1,995 Último mensaje 8 Junio 2016, 00:24 am
por geeke
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines