|
|
|
Не получить корректный 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 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
alekcvp _Vasilisk_ Смотри на первые три поля. В сумме 4 байта и все само пакуется А ты вообще понимаешь что такое выравнивание? Если ты эту структуру в Delphi опишешь, то у тебя будет так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. То что закомментировано добавит компилятор. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 20:30 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так: Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где не надо. Да, реально, я почему-то думал что он каждое поле будет выравнивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 20:30 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так: Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где не надо. Не, ты что реально что ли настолько тупой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 01:16 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Я реально портировал более чем достаточно структур с Си на Дельфи чтобы знать о чём говорю. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 01:25 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
И поэтому ты видимо считаешь, что только один в теме, а все остальные - тупни? Я выше уже приводил пример работы с API (а именно с RAS), где для работы со структурой rasconn требуется именно {$ALIGN 4}, а для всех остальных структуру требуется {$ALIGN 8}. Хотя о чем это я, гуру ведь говорит иначе!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 01:55 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2 И поэтому ты видимо считаешь, что только один в теме, а все остальные - тупни? Я выше уже приводил пример работы с API (а именно с RAS), где для работы со структурой rasconn требуется именно {$ALIGN 4}, а для всех остальных структуру требуется {$ALIGN 8}. Хотя о чем это я, гуру ведь говорит иначе!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 13:18 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Ничего подобного. В WinApi структуры упакованы сами по себе. Там все поля либо четырехбайтовые, либо появляются всякие reserved. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 13:28 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2Хотя о чем это я, /гуру/ ведь говорит иначе!) А теперь подыми глаза повыше и перечитай что именно говорит гуру. Повторяю медленно: при любых непонятках со структурами надо первым делом сравнивать размеры и смещения каждого их поля. И общий размер структуры тоже если она используется в массиве. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 13:45 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Barlone asutp2 И поэтому ты видимо считаешь, что только один в теме, а все остальные - тупни? Я выше уже приводил пример работы с API (а именно с RAS), где для работы со структурой rasconn требуется именно {$ALIGN 4}, а для всех остальных структуру требуется {$ALIGN 8}. Хотя о чем это я, гуру ведь говорит иначе!) Dimitry Sibiryakov asutp2Хотя о чем это я, /гуру/ ведь говорит иначе!) А теперь подыми глаза повыше и перечитай что именно говорит гуру. Повторяю медленно: при любых непонятках со структурами надо первым делом сравнивать размеры и смещения каждого их поля. И общий размер структуры тоже если она используется в массиве. ок, смотрим выше твое же сообщение Dimitry Sibiryakov alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так: Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где не надо. Так ты уже определись наконец, что делать ПОСЛЕ того, как определены расхождения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 14:19 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2Так ты уже определись наконец, что делать ПОСЛЕ того, как определены расхождения? ПОСЛЕ - аккуратно применять опции выравнивания если они нужны. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 14:36 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2 Я использовал например RasConnStatus, RasEapInfo, RasDialParams, RasEntryName, RasEntry, RasDialExtensions, RasStats - они и для x32 и для x64 корректно работают при {$ALIGN 8} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 14:39 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Повторяю медленно: при любых непонятках со структурами надо первым делом сравнивать размеры и смещения каждого их поля. И общий размер структуры тоже если она используется в массиве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 14:43 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Бывают конечно казусы. Например, в какой-то старой версии delphi TGUID был описан как packed record. Вот тогда в одном месте пришлось действительно проверять смещение каждого поля. Кода исправили, не знаю, но сейчас в 10.2 packed для TGUID уже нет. И выравнивается он теперь как положено - на 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 14:53 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Barloneобычно проще в исходник посмотреть. ....а там в объявлении макросы на typedef-ы и пока дойдёшь до настоящего типа, состаришься. Проще тестовую программку на экран размером сляпать. А уж если кто-то применил тип long, так вообще начинается самая забава... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 15:09 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Barlone asutp2 Я использовал например RasConnStatus, RasEapInfo, RasDialParams, RasEntryName, RasEntry, RasDialExtensions, RasStats - они и для x32 и для x64 корректно работают при {$ALIGN 8} Dimitry Sibiryakov asutp2Так ты уже определись наконец, что делать ПОСЛЕ того, как определены расхождения? ПОСЛЕ - аккуратно применять опции выравнивания если они нужны. в данной конкретной ситуации нужны и поэтому используются. Продолжить мысль? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 15:15 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2Лично у меня в проектах для виндов по умолчанию именно $ALIGN 8, а не 4, для macos - $ALIGN 16 asutp2в данной конкретной ситуации нужны и поэтому используются. Продолжайте мысль. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 15:33 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
asutp2 Эмба рекомендует использовать {$ALIGN 8}, поэтому такое выравнивание и используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 16:55 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Barlone asutp2 Эмба рекомендует использовать {$ALIGN 8}, поэтому такое выравнивание и используется. Dimitry Sibiryakov asutp2Лично у меня в проектах для виндов по умолчанию именно $ALIGN 8, а не 4, для macos - $ALIGN 16 asutp2в данной конкретной ситуации нужны и поэтому используются. Продолжайте мысль. Я вообще не улавливаю смысла претензии. Поясните. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 17:22 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Barlone Например, в какой-то старой версии delphi TGUID был описан как packed record. Вот тогда в одном месте пришлось действительно проверять смещение каждого поля. Кода исправили, не знаю, но сейчас в 10.2 packed для TGUID уже нет. И выравнивается он теперь как положено - на 4. Кровавые подробности? Так-то полям TGUID выравнивание не требуется. (у поля D3 смещение - 6, например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 17:45 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Barlone Например, в какой-то старой версии delphi TGUID был описан как packed record. Вот тогда в одном месте пришлось действительно проверять смещение каждого поля. Кода исправили, не знаю, но сейчас в 10.2 packed для TGUID уже нет. И выравнивается он теперь как положено - на 4. Кровавые подробности? Так-то полям TGUID выравнивание не требуется. (у поля D3 смещение - 6, например). На С есть Код: plaintext 1. 2. 3. 4. И тут у нас 2 байта паддинга между a и b. Транслируем на паскаль, и b прилепляется к a, несмотря на {$ALIGN 4}, потому что у packed record собственное выравнивание 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 18:25 |
|
||
|
Не получить корректный Record по указателю из С++ DLL
|
|||
|---|---|---|---|
|
#18+
Barlone, Но packed оно о внутренней компоновке полей записи, а не о самой записи в составе другого типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2021, 18:36 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037703]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 400ms |

| 0 / 0 |
