|
|
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Возникла необходимость на Delphi написать DLL в которой функция должна возвращать массив записей типа : Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Пример предельно упрощенный, Фишка в том, что эту DLL предполагается использовать из программ написанных на разных языках и средах, типа C++, PowerBuilder, Java, Delphi Мне приходилось писать несложные DLL для своих же нужд (для использования из программ написанных на Delphi же) Но как я понимаю, для этой задачи нужно, видимо как-то особенно организовать данные, которые вернет функция. Чтобы у тех кто ее будет использовать не возникло проблем. Как минимум потому, что типы в Delphi и в том же C++ это разные вещи. У кого был такой опыт подскажите как тут быть, с какой стороны подойти... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 16:55 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker Код: pascal 1. 2. 3. 4. 5. Примерно так. Эти типы совместимы. https://stackoverflow.com/questions/4420188/how-to-format-a-unix-timestamp-in-delphi ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 17:00 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, не, нельзя управляемые типы (string, объекты). Можно, если использовать COM(OLE), вебсервисы и проч. Можно упаковывать в портабельные форматы (json, xml). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 17:34 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Используй интерфейсы. Строки передавай в widestring, pansichar, pchar, pwidechar. Не используй управляемые типы. Используй метод передачи параметров safecall или stdcall, cdecl (для java). Не возвращай записи в результате функции. В функции возвращаешь результат работы функции или код ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 17:46 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, В какой DLL выделил память в той и удаляешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 17:48 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
И делай структуры packed, чтобы не налететь на разницу в выравнивании. Либо явно задавай размер выравнивания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 17:57 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
ziv-2014Используй интерфейсы. Вовсе не обязательно. Большой оверхед во многих случаях Не возвращай записи в результате функции. В функции возвращаешь результат работы функции или код ошибки. Можно, но не обязательно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 17:59 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Василий 2Не возвращай записи в результате функции. В функции возвращаешь результат работы функции или код ошибки. Можно, но не обязательно Разные языки программирования по разному возвращают структуры, как результат функции. С# и Delphi не совместимы и будет эксепшен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 21:01 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, От managed-типов придётся отказаться, либо "выводить" функции для управления ими К дельфи-специфичным типам вроде TDateTime тоже лучше не прибегать. Возьми аналоги, например Linux Time С масивом всё просто, смотри похожие функции в WinAPI, там везде функция имеет два логичесикх варианта вызова: определение необходимого размера и собственно сама работа. Т.е. необходимую память выделяет вызывающая сторона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2019, 08:52 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Пытаюсь вернуть строку из DLL. Пишу в таком духе: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. вот так пытаюсь ее прочитать из внешней программы: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. В MyStr в итоге оказывается мусор из иероглифов В чем ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 15:07 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, зачем Код: pascal 1. если Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 15:36 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
cptngrb, Вы правы, промашка. Но это не решает проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 15:48 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerВ чем ошибка? Например в том, что несколько вызовов PChar(Buffer) не гарантируют одного и того же результата. Убирайте Ваш PChar() и передавайте уже саму переменную Buffer, как ссылку на выделенный участок памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 15:52 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, а Код: pascal 1. и Код: pascal 1. одно и тоже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 16:23 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerВ чем ошибка?Во всем. Начиная с записи в пустоту SQL-Talker Код: pascal 1. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 16:31 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Все равно не получаю то что надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 16:32 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
В моем примере заменить _Vasilisk_ Код: pascal 1. на Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 16:36 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Код: pascal 1. 2. 3. 4. и вы будете менять pchar, pansichar, widestring, string то ничего не получиться. подбором может только случайно получиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 16:38 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Ваш пример работает на ура. Спасибо Буду разбирать, чего я в этой технологии не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 16:45 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, А зачем в DLL длина буфера берется на 1 больше, если потом во внешней программе все равно идет уменьшение на эту же единицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 17:17 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerА зачем в DLL длина буфера берется на 1 больше, если потом во внешней программе все равно идет уменьшение на эту же единицу?Мы передаем абстрактный PChar. Он заканчивается \0. Поэтому мы добавляем 1 в dll Память мы выделяем функцией SetLength. В Делфи все строки заканчиваются \0, поэтому SetLength автоматически выделит память под этот \0. Отсюда -1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 17:24 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, авторВ Делфи все строки заканчиваются \0 это где так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 17:51 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaonавторВ Делфи все строки заканчиваются \0это где так?Везде Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 17:56 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaon, А как, по твоему, работает привидение к PChar? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 17:57 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, авторА как, по твоему, работает привидение к PChar? чудом, не иначе включи range check, узнаешь много нового. никакого нуля сзади строки нет. ну и посмотри как приведение работает. подсказка: UStrToPWChar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 19:41 |
|
||
|
|

start [/forum/topic.php?fid=58&startmsg=39815407&tid=2039273]: |
0ms |
get settings: |
4ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
46ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 316ms |

| 0 / 0 |
