|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Собственно ситуация примерно как здесь: Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer) Хотя вещи совершенно разные. VS2013 EE VB.Net на Win8.1 Net 4.5 (дефолт) -работает Конвертирую в Net2(3.5 и т.п.) -глючит, обратная конвертация проекта в 4.5 уже не помогает. Код (урезанный, но достаточный для воспроизведения бага): Код: 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. 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.
В .Net 4.5 работает (находит 5 модемов, DevInst 1-5), дебаг дает: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
После конвертации проекта в .Net2 - не работает, Код: vbnet 1. 2. 3. 4. 5. 6. 7.
и меня уже очень смущает уже Marshal.SizeOf(m_DeviceInfoData) =40 (вместо 28) При этом подтасовка m_DeviceInfoData.cbSize =28 все равно выводит ошибку про буфер. А если этот .Net2-конвертированный проект компильнуть и сунуть на XP, то все работает. Я этого не понимаю, ощущение (этот пост и предыдущий) что наступаю на одни и те же грабли. Глючит на .Net2 скорее всего этот ваш Marshall. Предполагаю, что я что-то "не дописываю", что на .Net 4.5 проходит по дефолту, а на .Net2 (после конвертации) надо указать явно (м.б.какие-то слова при опеделении структур, но Юникода в этих структурах нет). М.б. что то путаю с Integer/IntPtr, но полагаю и то и другое 4 байта. Тест -Проект .Net4.5 (рабочий - дефолтный не "порченный") прилагаю. Чтоб дебаг чего-то выводил, надо чтоб на компе был хотя б один модем. Но можно то же воспроизвести и с портами: Код: vbnet 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 10:44 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Дмитрий77 Код: vbnet 1.
вообще-то это DWORD ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 11:38 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Дас, наверно надо аккуратнее Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Странно, в .Net 4.5 Marshal.SizeOf(New IntPtr) =4, а после конвертации проекта в .Net2 Marshal.SizeOf(New IntPtr) =8, хотя откуда 40 все равно не догоняю или невнимателен, 2*(8-4)= +8 (а не 12) Привык я к As Long в VB6 вместо всего подряд, и муваю все это в Integer/Int32/IntPtr по сути как в голову взбредет (типа по смыслу). Наверно неправ. SP_DEVINFO_DATA structure Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Так заработало "везде одинаково". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 11:46 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Дмитрий77, размер IntPtr зависит от разрядности приложения 32 vs 64 в сокетах есть структуры вообще с разным лэйаутом для 32 и 64 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 12:15 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Изопропилразмер IntPtr зависит от разрядности приложения 32 vs 64 Ну, в VB.Net 2013 "Any CPU" -должно устраивать, почему нет. Только при конвертации .Net 4.5 в .Net2 в этой же студии почему-то IntPtr размер прыгает с 4 до 8 байт - на том же самом Win 8.1 x64. И при обратной конвертации в .Net 4.5 назад к 4 байтам не прыгает А при переносе этого exe-шника .Net2 на XP все опять работает. Да не я понимаю что все управляется "внешней шарашкой", но однако ж бардак. Не, в скелетиках может и интересно копаться, но копаться в скелетиках .Net честно желания нет. Сказано "Any CPU" -звучит красиво, меня устраивает. Ну, принципы главное понять, чего можно писать, а чего нельзя. Пока грабель не наломаешь, видимо не утрясется. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 12:45 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Дмитрий77Сказано "Any CPU" -звучит красиво, меня устраивает. только не можешь предсказать 4 или 8 байт будет IntPtr ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 12:52 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Изопропилтолько не можешь предсказать 4 или 8 байт будет IntPtr Это на x64. На x86 он всегда 4. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 13:38 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныЭто на x64. На x86 он всегда 4. Any CPU не позволяет сделать вывод о размере указателя.Никакого противоречия ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 14:05 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Изопропилтолько не можешь предсказать 4 или 8 байт будет IntPtrСон Веры ПавловныЭто на x64. Похоже на то. Даже и не предскажешь путем проверки типа OS на IsWin64. Ну, значит надо аккуратно типы писать, чтоб было универсально. В этом топике я вроде справился. Ну опять же, справился или "подтасовал"? Понятно, что если я использую 3 элемента структуры из 10-ти и эти 3 попадают "на свои места", то код будет работать, а при обращении к оставшимся 7-ми не факт. Теоретически, если такая неоднозначность с длинной одного и того же типа, то стало быть использование "правильных" типов должно гарантировать "универсальность" кода. Счас пытаюсь с вот этим: 17003714 но суко пока на .Net2 даже CDDS_PREPAINT/CDDS_ITEMPREPAINT нормально не отдает, а lvcd.clrText еще глубже запрятан. Просто если "универсальность" нереальна, то тяжело с API будет -гораздо сложнее чем в 32-битном VB6 с его Long-ами. Пусть даже потребность в этих API 10% от оригинала. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 14:07 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
ИзопропилAny CPU не позволяет сделать вывод о размере указателя.Никакого противоречия Под x86/x64 подразумевался не platform target проекта, а платформа, на которой проект запускается. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 14:30 |
|
Получаю список модемов через API Net4.5-работает, конвертирую в Net2 -не работает
|
|||
---|---|---|---|
#18+
Дмитрий77Ну опять же, справился или "подтасовал"? Понятно, что если я использую 3 элемента структуры из 10-ти и эти 3 попадают "на свои места", то код будет работать, а при обращении к оставшимся 7-ми не факт. Теоретически, если такая неоднозначность с длинной одного и того же типа, то стало быть использование "правильных" типов должно гарантировать "универсальность" кода. аккуратно расписывать нужно, иногда имеет смысл явно смещения задавать на худой конец в тяжёлых случаях - в рантайме ветвиться. а грубо проверить можно сравнив sizeof с C реализацией ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 14:43 |
|
|
start [/forum/topic.php?fid=20&msg=38834842&tid=1402123]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
109ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 200ms |
0 / 0 |