|
|
|
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 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaonвключи range check,Мы сейчас говорим о корректности обращении к символу строки за пределами ее длины или о физическом состоянии памяти? makhaonподсказка: UStrToPWChar. Код: pascal 1. 2. 3. 4. 5. 6. 7. и что я должен был тут увидеть? То, что просто возвращается указатель на строку? Которая, внезапно, оказывается нуль-терминатной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 19:48 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, в документации описано про гарантированный ноль в конце строки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 20:07 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaonв документации описано про гарантированный ноль в конце строки?Например вот http://docwiki.embarcadero.com/RADStudio/Tokyo/en/String_Types_(Delphi) You can also cast a UnicodeString or AnsiString string as a null-terminated string. The following rules apply: If S is a UnicodeString, PChar(S) casts S as a null-terminated string; it returns a pointer to the first character in S . Such casts are used for the Windows API. For example, if Str1 and Str2 are UnicodeString, you could call the Win32 API MessageBox function like this: Код: pascal 1. Use PAnsiChar(S) if S is an AnsiString. You can also use Pointer(S) to cast a string to an untyped pointer. But if S is empty, the typecast returns nil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2019, 23:21 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
а я видел строки без /0 и с /0 посередине )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 09:12 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
cptngrbа я видел строки без /0 и с /0 посередине )) вот прямо string без завершающего нуля? это, наверно, ошибка в программе была. Delphi всегда выделяет памяти на символ больше длины строки и пишет 0 в лишний символ. В самой строке нулей может быть сколько угодно, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 10:15 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
RWolf, конечно ошибка, но я то думал, что такого не бывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 10:20 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaon_Vasilisk_, авторА как, по твоему, работает привидение к PChar? чудом, не иначе включи range check, узнаешь много нового. никакого нуля сзади строки нет. Есть makhaonну и посмотри как приведение работает. подсказка: UStrToPWChar. А ты сам смотрел как работает UStrToPWChar? Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 10:22 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
ок, уговорили, черти красноречивые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 12:01 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
cptngrbа я видел строки без /0 и с /0 посередине ))И что? Это не противоречит тому, что строка оканчивается \0 Вот при касте к PChar такой строки она обрежется до серединного \0. Вернее, если принимающая сторона считает длину строки по завершающему \0, то она прочитает только часть строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 14:34 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, вы категорично заявляли, что заканчивается 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 16:31 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Вот при касте к PChar такой строки она обрежется до серединного \0. Вернее, если принимающая сторона считает длину строки по завершающему \0, то она прочитает только часть строки вот и приходилось нолик игнорировать в середине ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 16:33 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
cptngrb_Vasilisk_, вы категорично заявляли, что заканчивается 0.да, заканчивается, но это никак не исключает, что нулей может быть больше одного, завершающего "Те кто говорят, что у Кутозова не было одного глаза, нагло врут. Один глаз у него был!!!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2019, 17:06 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, товарищ! Не слушай некоторых тут, они давно не чистили лук на подводной лодке . Читай сюда: Разработка API (контракта) для своей DLL или: не создавайте своих DLL, не прочитав эту статью! . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2019, 22:37 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaon никакого нуля сзади строки нет Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Включаем отладчик, попадаем в функцию Код: 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. От сюда видим Код: pascal 1. Идём дальше, и проверяем PAnsiChar И в конечном итоге попадаем на выделение строки Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Где опять же видим Код: pascal 1. Чудом, не иначе AnsiString type Код: 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. [/SRC] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2019, 00:38 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
shonli95, Явного нуля в конце строки нет. Текущая частная реализация. Можно, конечно, заложиться. Но внезапно поменяется завтра что-то - и всё посыпется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2019, 15:15 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2019, 15:37 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
makhaon, есть, это легко проверить. Когда ты пытаешься вывести строку, она конвертируется не на стадии присвоения string к PWideChar а на выводе. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. При вызове Writeln приведёт к тому, что строка будет скопирована Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. И при создании данной строки, будет создана новая строка _NewUnicodeString -> Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Где на конце, располагается символ конца строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 10:06 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
GunSmokerЧитай сюда: Разработка API (контракта) для своей DLL или: не создавайте своих DLL, не прочитав эту статью! . Мне кажется, или там ошибка в разделе "Выделенные функции"? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 11:24 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
alekcvp, может у меня глаз замылился, в чём там вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 12:49 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Да там легко можно узнать выделенный размер блока, и функции для освобождения этим и пользуются по умолчанию. Это вам не delphi с его крутым менеджером К примеру Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Имеет GetSize, но Free не принимает второго аргумента, что бы удалить определённое количество. Так же и там. Майки не дают делать программисту - то, что ему не нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 13:53 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
GunSmokeralekcvp, может у меня глаз замылился, в чём там вопрос? В том, что память выделяется через GetDynData(), а освобождается через CoTaskMemFree(), вместо FreeDynData() (или как там). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 14:37 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Идём на сайт https://docs.microsoft.com/en-us/windows/desktop/api/combaseapi/nf-combaseapi-cotaskmemalloc Видим, что это аналог IMalloc::Alloc видим, что освобождение идёт через CoTaskMemFree что аналогично IMalloc::Free Ну а ваще Ок Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 15:27 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
GunSmoker Код: pascal 1. 2. 3. 4. 5. Это ведь означает лишние _AddRef/_Release на каждый вызов функции, разве нет? в чём выгода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 16:34 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
авторНе нужно делать реализацию методов интерфейса виртуальными:Бред. Если методы будут в дальнейшем переопределяться, то они должны быть виртуальными авторНе помечайте интерфейсные параметры модификатором const:с какого перепугу? Наоборот, они должны быть всегда c const, чтобы не дергать счетчик ссылок автор Код: pascal 1. 2. Идея красивая. Но импортер Delphi не умеет импортировать Код: plaintext 1. в Код: pascal 1. . А каждый раз руками править замучаешься ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 17:51 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_с какого перепугу? Наоборот, они должны быть всегда c const, чтобы не дергать счетчик ссылок Вангую, это такая соломка от: Код: pascal 1. тут без явной ( as ) передачи интерфейса будет утечка, если интерфейсный параметр является константным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 18:09 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyВангую, это такая соломка от:Зато будет сюрприз Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. У себя всегда пишу так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 18:58 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Зато будет сюрприз А так не будет: Код: pascal 1. Тут уж, либо с интерфейсами работаем, либо вручную объектами управляем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 19:23 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
shonli95alekcvp, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Я же специально указал раздел "выделенные функции", там в dll другой код - найдите тут CoTaskMemAlloc: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. И текст из статьи, цитирую: Другой вариант - обернуть ваш предпочитаемый менеджер памяти в экспортируемую функцию. Соответственно, в документации к функции должно быть указано, что для освобождения памяти нужно вызывать не CoTaskMemFree (или что вы там использовали), а вашу функцию-обёртку . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 19:32 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Всё - всё, понял - понял) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2019, 20:13 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
alekcvp, спасибо, исправил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2019, 03:03 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_с какого перепугу? У меня под конец уже время закончилось, я уж не стал расписывать, тем более, что в блоге и так было. Так да, это "защита от дурака". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2019, 03:12 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
В статье про DLL предлагается использовать BSTR получения/передачи строковых данных. Пытаюсь в DLL, написанной в Delphi, возвращать строковое значение из функции в WideString (он же BSTR), но получается ерунда. Если DLL вызывать из программы написанной в Delphi то все хорошо, если вызывать из C++, то получаем ошибку "Out of memory". Код DLL: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вызов DLL из Delphi (все работает): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Вызов из C++ (ошибка "Out of memory"): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Что тут не так? Почему не работает? Или идея с BSTR не совсем рабочая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 11:04 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, а так пробовал? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 12:01 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), При таком варианте, компилятор выдает ошибку на строке вызова функции: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 13:51 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Импорт должен быть таким Код: plaintext 1. Ссылку на документацию найти не могу, но для сложных возвращаемых типов (строки, записи, массивы) в Delphi функция превращается в процедуру с последним var параметром. Т.е. это SQL-Talker Код: pascal 1. компилятор превращает в это Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 16:18 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
GunSmokeralekcvp, спасибо, исправил. GunSmoker, подкорректируйте плиз тогда и глобальный пример, который у вас приложен к статье :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 16:58 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Заработало! Спасибо)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 17:06 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, лучше уж тогда safecall заюзать, однотипно будет хоть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 17:10 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), stdcall - требование заказчика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 17:31 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, да это и есть тот же stdcall, только результат функции всегда один и тот же тип ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 18:13 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), stdcall и safecall - это не одно и тоже. При safecall результат возвращается в параметрах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 19:32 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
ziv-2014, а при stdcall это невозможно? :-) абсолютно тот же stdcall, только результат функции всегда HResult ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 20:08 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понимаю, что для функции типа Код: pascal 1. В C++ импорт должен быть таким: Код: plaintext 1. Пробую так делать - вылетает ошибка при выполнении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 09:22 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, я бы предложил взять idl-ку какую ни будь из SDK как шаблон - компиляция там простая, и извращаться там (т.е. описывать всё на одном языке). Для Delphi и fpc тоже консолька импорта в pas есть. Так вы сможете понять как это будет выглядеть на других языках. Ну и конечно safecall, он удобнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 09:39 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerПравильно ли я понимаю, что для функции типа Код: pascal 1. В C++ импорт должен быть таким: Код: plaintext 1. Пробую так делать - вылетает ошибка при выполнении. Так должно быть Код: pascal 1. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 14:46 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Лучше переходи на интерфейсы (interface), так больше возможностей получаешь. Получаешь типа такого на си++: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Делфи: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Красота :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 14:51 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerПробую так делать - вылетает ошибка при выполнении.Проверь sizeof(BOOL) в Си и Делфи. А лучше использовать типы с явным размером. Например, WordBool SQL-Talker- вылетает ошибка при выполнении.Где? Какая ошибка? ziv-2014Так должно бытьНе должно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 15:01 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
ziv-2014, кстати, вполне вариант, условия на статик линковку у него вроде нет, судя по тому что он динамически грузит функцию загрузил одну функцию возвращающую интерфейс и всё интерфейс в idl описал для надёжности, лепота... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 15:32 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, И в Delphi и в C++ sizeof(BOOL) = 4 Вот исходники: Delphi DLL: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. C++: Код: 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. При выполнении си-шного кода, спотыкается об строку вызова функции из DLL и выдает в консоль "Process returned -1073741819 (0xC0000005)" Это если из IDE запускать (Code::Blocks), а так молча завершается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 15:50 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Пардон, заголовок функции в Delphi такой : Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 15:56 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, если заменить Код: plaintext 1. на Код: plaintext 1. что будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 16:17 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Тогда так Код: plaintext 1. Или в делфи Код: pascal 1. Указатель на строку будет в eax, так что смотри сами. Лучше передавать данные через параметры, а не как результат функции - так надежнее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 16:22 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)SQL-Talker, если заменить Код: plaintext 1. на Код: plaintext 1. что будет? Тоже самое - падает на вызове функции из DLL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 16:24 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
Обернул код в Delphi в try .. except - получается что при вызове этой DLL из C++ там (в dll) вываливается Access Violation Код: 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. Спотыкается на строке Pointer(Result) := nil; Если ее убрать, спотыкается на Result := ... Т.е. что-то не так с Result При этом если эту DLL вызвать из проекта на Delphi же все работает норм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 16:33 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Pointer(Result) := nil; финализирует переданную строку я предположил что там мусор, когда задал вопрос 21925071 но ... сделайте ассемблерный листинг, гнуса нет посмотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 17:08 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker Код: pascal 1. Убрать. Это потенциальная утечка памяти. Вызывать так Код: plaintext 1. 2. Далее, адреса &bstr и @Result должны совпадать. Проверьте это ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 17:28 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, А тебя не смущает, что у тебя заголовки функций на Delphi и си они разные? В си ты передаешь 2 параметра (один BOOL, другой указатель и ничего не возвращаешь), а в делфи один параметр и один возвращаешь в результате? С чего бы должно работать-то? Стек поганишь само собой! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 17:30 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
ziv-2014, Вот тут _Vasilisk_ пояснял эту особенность: 21924280 Эта схема у меня работает на функциях без пходящих параметров, затык случился с функцией, у которой есть входной параметр ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 18:00 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Pointer(Result) := nil; - убрал в C++ вывожу адрес: Код: plaintext 1. все Ок в DLL вывожу адрес: Код: pascal 1. Если DLL вызывать из Delphi-кода, то отображается 16-ричное число А если из C++ то показывает строго 1 (единицу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 18:05 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Посмотрел. Для stdcall Result передается как первый параметр. Т.е. импорт должен быть таким Код: plaintext 1. и вызов Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 18:08 |
|
||
|
DLL - Написать DLL, в ней функцию, которая возвращает массив записей.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Взлетело! Вы просто волшебник )) Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 18:18 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039273]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
181ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
138ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 614ms |

| 0 / 0 |
