|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Есть структура. Там Union. Метод стандартный - в .Net тьфу-тьфу есть такой : <System.Runtime.InteropServices.FieldOffset(4)> Поясню на конкретном примере. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
И вижу, что это не работает, а потом понимаю что при SizeConst:=32 и CharSet.Unicode смещение =63 (думаю 32*2-1 байт) а не хрена не 32 А с другой стороны там м.б. CharSet.ANSI или CharSet.Auto то бишь задавая смещение явно, я могу угадать частные случаи, а могу тупо и не попасть. Аналогично, у меня по дороге до Union могут быть какие-нибудь IntPrt (4 или 8 байт). Можно ли здесь извернуться универсально, т.е. например задавать смещение не от начала структуры, а от какого то его элемента, ну хотя бы типа Код: vbnet 1.
? Простейший вариант, конечно вообще не прописывать Юнионы, а тупо писать "одну из ветвей" Юниона (любую, либо кот. нужна по смыслу задачи). Тогда FieldOffset не нужен. Но все же... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2014, 23:47 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Дмитрий77Можно ли здесь извернуться универсально, можно вложить одну структуру в другую ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2014, 23:56 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Изопропил, не пояснишь кодом. Рука если честно под .Net не очень набита. Вот так бы хотелось в идеале: (места откуда растут ошибки я выделил (32) и (70), Юнионы тоже выделил). Данный вариант еще не содержит IntPtr. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Ну, по идее для моих тек. целей прокатывает упрощенный вариант: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
И в VB6 я всегда поступал именно так. Но однажды пришлось писать 10+ структур и 10+ деклараций API вместо одной. Хочется как бы понять новую технологию с .FieldOffset и м.б. еще какие-инструменты есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 00:21 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Изопропил, ты предлагаешь Юнионы выносить в отдельные структуры и в этих отдельных задавать .FieldOffset? ДА? А если и в них какие-нибудь IntPtr-ы будут? Например. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 00:28 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Дмитрий77, попробуй так, не ручаюсь C# ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 00:39 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Где-то в степи, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 00:40 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Дмитрий77, это не , это авторы .net http://referencesource.microsoft.com/#mscorlib/system/Runtime/InteropServices/Variant.cs,bbbbd95d241ec510 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 00:40 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
по крайней мере это из валидного кода Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 00:42 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Где-то в степи, Ваш код для структуры полностью соответствует моему нижнему варианту. Мой нижний вариант - рабочий, также как и ваш. Но он не учитывает: DEVMODE structure Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Мой верхний код "пытается" это делать через известную технику Код: vbnet 1.
Но как вы понимаете ошибается на строчке Код: vbnet 1.
потому что Dim dmDeviceName As String это не 32 а для Юникода 63. Здесь я могу конечно подтасовать так: Код: vbnet 1.
Ну и исправить все что ниже. Но если б у меня там стоял IntPtr (перед Юнионом ) -к примеру, то я б так сделать не смог (если я рассчитываю на any CPU или хотя бы на 2 версии exe x86 и x64, ну вы меня поняли). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 01:02 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Ну вот так по идее универсальный вариант. Вроде работает. Но только при условии Код: vbnet 1.
для вложенных структур. C .Sequential не хочет заполнять вложенные. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
Честно, dm.U1.dmPrintQuality как то не очень смотрится в коде. Принцип понял, но думаю где на Юнион можно начхать и обойтись без него (зависит от конкретики), и при этом длины типов "плавают" и не разрешают задать offset явно - лучше так и продолжать чхать. Конкретно с этой структурой мне этот Юнион ни к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 01:32 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Дмитрий77, честно сказать удивляет, почему Вы интернетом не пользуетесь, а все постите сюда, и себя убиваете и других Вам же давали тынцы на это место ранее http://www.pinvoke.net/default.aspx/Structures/DEVMODE.html я как дурак, в надежде что там пусто по этой тематике, подпрягся, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134.
больше никогда (( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 02:25 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Где-то в степи, Вы не обижайтесь. Но вы вопроса не поняли. Я простых не задаю. Интернетом я пользуюсь, эти ссылки давно видел и ими/им подобными воспользовался. DEVMODE был приведен для примера. Еще раз. Вопрос был: как задавать OffSet-ы если типы в структуре могут иметь разную длину (в зависимости от...)? Пример 1. Так правильно Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А вот так неправильно: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Правильно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А вот так что будете писать? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Пример 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Как будете выкручиваться? Так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Или так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Один из вариантов так (Изопропил предложил, если правильно его понял): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Но не универсален. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 04:25 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Дмитрий77, CharSet = CharSet.Auto - не используйте не по назначению ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 09:58 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Изопропил, Ну, я сейчас придерживаюсь принципа CharSet = CharSet.Unicode Declare Unicode Function fun Alias "funW" хотя в VB6 всегда делал "funA" ANSI в обязательном порядке требует спецнастройки компа на язык программы, это неудобно. А вот с Ptr надо предусматривать всегда оба варианта, поэтому это я проверяю четко. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 10:38 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Если уж использовать FieldOffsetAttribute, наверно лучше LayoutKind ставить не Sequential, а Explicit, а ещё задать размер всей структуры. Смещение не от начала, а от последнего элемента - не находил такого способа. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 15:49 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Ilya81Если уж использовать FieldOffsetAttribute, наверно лучше LayoutKind ставить не Sequential, а Explicit, . Насколько я понял, для вложенной c FieldOffset Explicit обязательно, иначе она не заполняется данными при PtrToStructure. Ilya81а ещё задать размер всей структуры. Это как делается? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2014, 19:21 |
|
FieldOffset + Union, но при этом размер какого-нибудь IntPtr или String может плавать
|
|||
---|---|---|---|
#18+
Дмитрий77Насколько я понял, для вложенной c FieldOffset Explicit обязательно, иначе она не заполняется данными при PtrToStructure. Вот и я о том же. Дмитрий77Это как делается? Всё в том ж StructLayoutAttribute параметр Size. Тоже для варианта LayoutKind.Explicit. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2014, 12:04 |
|
|
start [/forum/topic.php?fid=20&msg=38841156&tid=1402084]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 336ms |
total: | 493ms |
0 / 0 |