|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Имеется DLL, написанная на C++, среди методов в заголовке (.h файл) есть функция (stdcall) int (const char* name, const char* surname, const char* patronymic) Как я понимаю, на Delphi функция будет выглядеть следующим образом: function (name: PAnsiChar; surname: PAnsiChar; patronymic: PAnsiChar): integer; stdcall; И действительно, до поры до времени всё работало, пока разработчик DLL не поменял заголовок своей DLL и не сделал int (const char *name, const char *surname, const char *patronymic) Теперь если с ней работать по-прежнему, фамилия имя и отчество передаются в DLL с искажениями. Вопрос - как должна теперь выглядеть функция в DLL - чтобы она соответствовала новому объявлению функции в Delphi. Перерыла весь Интернет, пробовала и по-старому и function (const name: PAnsiChar; const surname: PAnsiChar; const patronymic: PAnsiChar): integer; stdcall; function (var name: PAnsiChar; var surname: PAnsiChar; var patronymic: PAnsiChar): integer; stdcall; ничего не работает ... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 19:49 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Наталья87 Код: plaintext 1.
Код: plaintext 1.
Разница между этими объявлениями чисто косметическая, работать оно перестало совсем по другим причинам. Зная Вас - это из-за обращения к уже освобождённой памяти. Дуракам иногда внезапно перестаёт везти. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 20:04 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Будет ошибка, если функция теперь не stdcall. Попробуйте cdecl или fastcall. Calling Conventions Demystified ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 20:35 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Наталья87 Код: plaintext 1.
Код: plaintext 1.
Что-то я не увидел разницы... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 21:17 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
zedxxx Попробуйте cdecl Код: pascal 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 23:00 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Понятно, спасибо. Будем разбираться с разработчиком DLL. Возможно, он косячит, а не я ... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 09:46 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Наталья87 фамилия имя и отчество передаются в DLL с искажениями Это настораживает. С искажениями - это как, "Наталья" превратилась в "Володю"? Еще настораживают ваши PAnsiChar. Как вы их получаете? Если вот так Код: pascal 1. 2. 3. 4. 5. 6.
то у вас проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:51 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Наталья87 пробовала и по-старому и function (const name: PAnsiChar; const surname: PAnsiChar; const patronymic: PAnsiChar): integer; stdcall; function (var name: PAnsiChar; var surname: PAnsiChar; var patronymic: PAnsiChar): integer; stdcall; ничего не работает ... В Си это просто говорит компилятору, чтобы он запретил менять параметр в теле функции. В Паскале же, кроме этого, происходит дополнительная передача параметра по ссылке const p: PAnsiChar - это то же самое, что p: PP AnsiChar (ну и еще p менять нельзя). Короче, тот же var, только еще и говорит компилятору, чтобы запретил менять параметр в теле функции. Пробовать же var - это всё равно, что пробовать double вместо string, результат будет такой же. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 16:08 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRockПробовать же var - это всё равно, что пробовать double вместо string, результат будет такой же. Адептов школы стохастического программирования это никогда не останавливало. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 16:21 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRock В Паскале же, кроме этого, происходит дополнительная передача параметра по ссылке Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 16:39 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Наталья87 ... И действительно, до поры до времени всё работало, пока разработчик DLL не поменял заголовок своей DLL и не сделал int (const char *name, const char *surname, const char *patronymic) Теперь если с ней работать по-прежнему, фамилия имя и отчество передаются в DLL с искажениями . Очень интересно. То есть, получается, функция вызывается, но доходят кракозябры вместо некоторых (или всех) букв? Может, теперь DLL ожидает UTF8 или чего-то подобного? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 17:31 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Кроик Семён функция вызывается, но доходят Мне кажется, что если бы ТС знал, что там "доходит", его бы тут не было. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 18:13 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
_Vasilisk_ YuRock В Паскале же, кроме этого, происходит дополнительная передача параметра по ссылке Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Честно говоря, даже не знал. Знал, что структуры по ссылке передаются при const, но думал, что и все типы так. А теперь проветил, и оказывается, что даже структуры не все, а только те, что длиннее размера указателя. Вот спасибо, век живи - век учись. Интересно, в Си тоже так, или нет. Я уже и в этом не уверен, и проверить не на чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 18:33 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRockИнтересно, в Си тоже так, или нет. У Си собственные методы оптимизации вызовов и они тоже в стиле "тут играем, а тут рыбу заворачивали". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 18:46 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRock Интересно, в Си тоже так, или нет. Именно в С параметры всегда передаются копированием. Если нужно работать с оригиналом, то в функцию явно передается указатель - но тоже копированием. В C++ есть ещё параметры - ссылки, это сахарок над указателями, типа паскалевских модификаторов var, out или const. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 18:57 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRock Знал, что структуры по ссылке передаются при const, ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 19:06 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
_Vasilisk_ Если соглашение вызова register, то все длинные структуры передаются по ссылке. А потом в функции параметры без const копируются в локальные переменные. А вот при stdcall структура без const помещается в стек целиком Без const - всегда по значению передаются, с const - всегда по ссылке. Что при register, что при stdcall, что при pascal, что при cdecl. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 19:36 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRock Не может быть, сейчас проверил. Без const - всегда по значению передаются Код: 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.
Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 20:01 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
_Vasilisk_ Издеваешься? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
У меня D7 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 20:07 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRock Но я адреса параметров сравнивал. _Vasilisk_ Если соглашение вызова register, то все длинные структуры передаются по ссылке. А потом в функции параметры без const копируются в локальные переменные YuRock Я в асме не силён, мягко говоря ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 22:39 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
Вообще вот тут довольно подробно расписано, как параметры передаются: https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Program_Control_(Delphi) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 22:55 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
_Vasilisk_ YuRock Но я адреса параметров сравнивал. _Vasilisk_ Если соглашение вызова register, то все длинные структуры передаются по ссылке. А потом в функции параметры без const копируются в локальные переменные Это и значит - передача по значению (хоть бы и начиналась она с передачи ссылки). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2022, 00:35 |
|
Конвертация типов для работы с DLL C++ из Delphi
|
|||
---|---|---|---|
#18+
YuRock Это и значит - передача по значению Кстати, достаточно функцию объявить как assembler и никакого копирования уже не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2022, 15:39 |
|
|
start [/forum/topic.php?fid=58&msg=40130358&tid=2036672]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 158ms |
0 / 0 |