|
|
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Дельфи 10.3.3 Есть железяка и DLL от производителя. Описание вызова: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Основываясь на C# примере (с диска производителя) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. получаю результат как на экране железяки, например, 75 68 65 68 0 0 0 0 пытаюсь получить тоже самое в Delphi Код: pascal 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. В результате вижу следующее: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Предположил, что проблема в длине принимаемого массива внутри union. Изменил: Код: pascal 1. Результат: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Записал лог Wireshark Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Подскажите, пожалуйста, что я упускаю при работе с данной Си++ функцией? Может надо как-то по иному вызывать её? Или дельфи некорректно обрабатывает её ответ? Спасибо! ЗЫ. Код писал только для теста получения данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 20:52 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Вот это Kast2K Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Функцию можно объявить так Код: pascal 1. Kast2K Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 22:47 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, odbdgn = record надо объявлять как odbdgn = packed record, иначе делфовский компилятор выравняет поля в завиисмости от {$ALIGN XX} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 05:30 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Коллеги, спасибо за подсказки! Но, как оказалось, я сам лопух :) не дочитал спецификацию на дополнительные вычисляемые параметры оборудования и передавал не тот параметр. Всё работает отлично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 07:44 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2 dbdgn = record надо объявлять как odbdgn = packed record, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 10:34 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ asutp2 dbdgn = record надо объявлять как odbdgn = packed record, Обоснуй? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 10:41 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal Обоснуй? С++ вроде по-умолчанию использует выравнивание то ли 4 то ли 8 байт, как и Delphi. Это в WinApi всё packed. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 11:34 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
alekcvp Это в WinApi всё packed. Пример Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Смотри на первые три поля. В сумме 4 байта и все само пакуется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 12:22 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Fr0sT-BrutalОбоснуй? Ты не поверишь, но Си тоже выравнивает поля. Причём чаще всего точно так же как Дельфи. Но иногда некоторые указывают Дельфи неверное выравнивание. Поэтому при портировании и непонятках со структурами, первое, что надо сделать, это вывести общую длину структуры и смещение каждого поля в Си и Дельфи. Потом сравнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 13:29 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ alekcvp Это в WinApi всё packed. Для работы со структурой rassconn требуется {$ALIGN 4}, для всех остальных структур {$ALIGN 8}, a reserved в структурах практически нет вообще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 13:42 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2 Для работы со структурой rassconn требуется {$ALIGN 4}, asutp2 для всех остальных структур {$ALIGN 8}, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 14:12 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 14:20 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ asutp2 Для работы со структурой rassconn требуется {$ALIGN 4}, _Vasilisk_ asutp2 для всех остальных структур {$ALIGN 8}, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 15:00 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2Лично у меня в проектах для виндов по умолчанию именно $ALIGN 8, а не 4, для macos - $ALIGN 16 Именно это я и имел ввиду когда говорил про чудаков, ставящих левые настройки куда не надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 15:11 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov asutp2Лично у меня в проектах для виндов по умолчанию именно $ALIGN 8, а не 4, для macos - $ALIGN 16 Именно это я и имел ввиду когда говорил про чудаков, ставящих левые настройки куда не надо. Учитывая, что используемые мною значения как раз и рекомендуются Эмбаркадерой (внимательно смотрим ссылку ), то чудик тут тот, кто не следует обоснованным рекомендациям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 15:51 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Вот только нет по ссылке такой рекомендации. "For OS X applications, stack alignment must be on 16-byte boundaries." Внезапно, но "stack alignment" не имеет никакого отношения к "field alignment" и второе не влияет на первое. Впрочем, что взять с вики... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 15:59 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, речь идет именно о field alignment, слово stack это всего лишь описка. Поищи в web-архиве эту статью из блога, там было всё подробно расписано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 16:29 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
http://web.archive.org/web/20090523104516/https://blogs.embarcadero.com/eboling/2009/05/20/5607 In the Mac OS X ABI Function Call Guide there is an innocent little sentence: "The stack is 16-byte aligned at the point of function calls." Перевести или сам как-нибудь справишься?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 16:40 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2 речь идет именно о field alignment, слово stack это всего лишь описка. Дефолтное выравнивание полей записи: dccosx - 8, dccosx64 - 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 16:48 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, так сейчас актуально только dccosx64, а 32и битные уже всё, в истории ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 17:35 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov http://web.archive.org/web/20090523104516/https://blogs.embarcadero.com/eboling/2009/05/20/5607 In the Mac OS X ABI Function Call Guide there is an innocent little sentence: "The stack is 16-byte aligned at the point of function calls." Перевести или сам как-нибудь справишься?.. Давай жги) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 17:35 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2Давай жги) "Значение указателя стэк при вызове функции должно быть кратно 16 байт." Я не знаю какой кретин сумел это хоть как-то связать с выравниванием полей записи, но надеюсь, что он всё ещё работает в Эмбаркадеро и не может навредить остальному миру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 17:51 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Ну вот, собственно, о чем я и говорил. Интерфейсные форматы оставлять на откуп платформе и компилятору - плохой путь, ничем не лучше DateToStr(Now). Вот описали кучу сишных структур без всякой привязки, рассчитывая на выравнивание по 4, а потом в конечном софте вдруг кто-то вхрненачил прагму на 8, а тупорылая сишная манера "сначала засунем все инклюды в один огромный исходник, а его будем компилировать" запросто позволит этой прагме повлиять на ВСЁ, что идет и подключается за ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 17:53 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Смотри на первые три поля. В сумме 4 байта и все само пакуется А ты вообще понимаешь что такое выравнивание? Если ты эту структуру в Delphi опишешь, то у тебя будет так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. То что закомментировано добавит компилятор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 19:45 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так: Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где не надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 20:13 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40035651&tid=2037703]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 483ms |

| 0 / 0 |
