|
|
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Господа, возникла следющая проблема Имеется DLL, в экспортируемых функциях вызываются методы класса, объект которого объявлен в DLL. На всякий случай код main.cpp 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. 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. Эта библиотека вызывается в Delphi. (Зачем encode_info передаётся как char ** не спрашивайте, ибо не знаю и изменить не могу). При отработке функции DoProcess в encode_info помещается информация, которая используется уже в самой Delphi. Из Delphi вызывается с параметром типа var PChar. Проблема в том, что из DoProcess ничего не выходит. Т.е. если смотреть в дебаге с заходом в DLL, то в эту переменную нужные данные ложатся, а при выходе из функции, последный переданный параметр - пустой. Подсказали, что проблема с выделением и освобождением памяти, но что конкретно - не могу понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 13:40 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
AlexeyLПодсказали, что проблема с выделением и освобождением памяти, но что конкретно - не могу понять. Возможно входные параметры не корректные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 13:44 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
Akh AlexeyLПодсказали, что проблема с выделением и освобождением памяти, но что конкретно - не могу понять. Возможно входные параметры не корректные. Самое интересное - если написать маленькую программу на С++, которая вызывает те же методы, то возвращается нормально, а при вызове из Delphi - проблема. Причём, в эту функцию ещё передаются все четыре параметра и все они используются внутри неё корректно, а вот информация наружу не передаётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 13:50 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
AlexeyLпроблема с выделением и освобождением памятиспособ передачи параметров одинаковый в проге на С++ и дельфи ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 13:56 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас AlexeyLпроблема с выделением и освобождением памятиспособ передачи параметров одинаковый в проге на С++ и дельфи ? Posted via ActualForum NNTP Server 1.4 И там и там stdcall ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:00 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
а каким образом туда ложатся данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:01 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
maXmoа каким образом туда ложатся данные? Типа такого Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:04 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
ёперный театр. Память выделяется в стеке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:13 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
maXmoёперный театр. Память выделяется в стеке? Память дял кого? Для lib_info? Пробовал и в стеке, и в куче - результат одинаков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:17 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
я бы порекомендовал юзать HeapAlloc в длле и HeapFree в дельфе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:18 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
но более распространённой практикой является выделение памяти вызывающим кодом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:19 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
maXmoя бы порекомендовал юзать HeapAlloc в длле и HeapFree в дельфе. Вся проблема в том, что код дельфы я менять не могу. Предысторя всего этого была такая - было несколько DLL, которые прекрасно работали и возвращали значения наружу, но функция DoProcess у них была не в объекте, а прям в самом коде. Т.е. encode_info заполнялась непосредственно в DoProcess, никуда не передаваясь. Мне же пришлось сделать несколько классов и один фреймворк для их оборачивания. И при передаче параметров в метод фреймворка происходит то, что происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:26 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
maXmoно более распространённой практикой является выделение памяти вызывающим кодом. lib_info - это локальная private переменная фреймворка, в которую собирается информация и затем кладётся в encode_info. Память под encode_info выделяется в дельфе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 14:30 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
выделяется? Точно? Раз память выделена, то чего ты тогда фигнёй страдаешь? Пиши сразу в выделенную память: Код: plaintext Код: plaintext Можешь привести код дельфы, чем инициализируется encode_info перед передачей в функцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 15:09 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
maXmoвыделяется? Точно? Раз память выделена, то чего ты тогда фигнёй страдаешь? Пиши сразу в выделенную память: Код: plaintext Код: plaintext Можешь привести код дельфы, чем инициализируется encode_info перед передачей в функцию? К сожалению не имею доступа к исходникам дельфы. Тестировать приходится прям из рабочего модуля. Либо на C++ делать минитест. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 15:28 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
Вообще любое использование значения этого указателя приводит к Access Violation. При этом, этот указатель ненулевой и там даже лежит переданные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 15:44 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
Блин, пролему я понял. При тестировании выделяется память под массив чаров, затем передаётся ссылка на этот массив. Но, т.к. массив организован на стеке, то при вызове функции ссылка указывает на указатель, которого уже нет в стеке. Таким образом получается exception. Может подскажете, как рещить это дело? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 15:59 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
сначала тебе нужно узнать, как работает дельфовый код с той вернутой строкой. Иначе будешь ловить косяки. Можно размещать массив в куче. В принципе *encode_info = lib_info; должен работать нормально, только будет утечка памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 17:31 |
|
||
|
DLL и класс
|
|||
|---|---|---|---|
|
#18+
maXmoсначала тебе нужно узнать, как работает дельфовый код с той вернутой строкой. Иначе будешь ловить косяки. Можно размещать массив в куче. В принципе *encode_info = lib_info; должен работать нормально, только будет утечка памяти. Спасибо. С горем пополам проблема решилась. Допёр я как работает всё это хозяйство. На самом деле утечка памяти имеет место, но уже со стороны Дельфы, т.к. происходит следующее - из Дельфы приходит указатель на PChar с необходимой для конфига инфой - далее в библиотеке создаётся новый массив, в него помещается нужная информация, и уже указатель на этот массив присваивается к encode_info и передаётся в дельфи. - затем, после копирования выведенной информации вызывается другая функция DLL, котоая удаляет этот массив. Т.е. переданный указатель на PChar переписывается, но старое его значение не удаляется. Жесть, танцы с бубнами. Согласен полностью, но придётся делать так. Всем огромное спасибо, топ можно закрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 17:49 |
|
||
|
|

start [/forum/search_topic.php?author=Touareg&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 476ms |
| total: | 672ms |

| 0 / 0 |
