|
|
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Есть Win клиент на C++Builder. Необходимо переслать двоичные данные на Linux сервер на Qt. Двоичные данные перед отправкой необходимо сжать. Поскольку на сервере разжимать их будет сервер средствами Qt, то и сжимать я решил средствами Qt. Для этого написал Dll на Qt для Win. Если память выделять malloc() и освобождать free() в клиенте, а в Dll подавать только указатель, то всё нормально работает. Но это тестовый вариант. В рабочем варианте заранее не известно сколько памяти нужно для буфера. (На оч. малом объёме размер сжатых будет больше чем не сжатых данных). Но любые попытки выделить немного памяти в клиенте, а в Dll сделать realloc() до нужного размера - приводят к плачевным результатам. Пробовал выделять память malloc() в Dll и потом очищать в клиенте - тоже всё плохо. Вообще возможно выделять память в Dll динамически ? Может ключики какие компилятору сообщить нада ? В Инете порылся ничего путного не нашёл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 15:42:45 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
сдаётся мне, что нельзя так жестоко поступать... память надо выделять и освобождать в одном месте - либо на клиенте, либо в dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 15:52:12 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
egorychсдаётся мне, что нельзя так жестоко поступать... память надо выделять и освобождать в одном месте - либо на клиенте, либо в dll. И я об этом. Где нагадил там и вычищай! Но единтсвенный работающий вариант на сейчас(now) это так: 1. Завести в DLL глобальный буфер. 2. Внутри DLL функция qCompress его заполнила и вернула размер 3. На клиенте выделить память этого размера 4. Вторая функция DLL взяв указатель от клиента, копирует содержимое этого буфера 5. Клиент освобождает память, когда уже не нужна. Но теперь меня смущает наличие глобальной переменной в DLL. Т.е. если юзер запустит несколько экземпляров клиентской части, что они получат из DLL ? Т.е. не будет ли конфликтов ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 16:08:45 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Зачем так сложно? В dll 2 функции 1-я. Сжать что дали и вернуть указатель на сжатое 2-я. Взять указатель от вызова 1-й и освободить клиент дернул первую функцию, поработал с возвращенным буфером, дернул вторую - освободил буфер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 16:32:18 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
ZmeisheНо теперь меня смущает наличие глобальной переменной в DLL. Т.е. если юзер запустит несколько экземпляров клиентской части, что они получат из DLL ? Т.е. не будет ли конфликтов ?Нет, конфликтов не будет. Каждый процесс который делает LoadLibrary заводит в том числе и новую копию глобальных переменных объявленных в DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 17:09:33 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
White OwlНет, конфликтов не будет. Каждый процесс который делает LoadLibrary заводит в том числе и новую копию глобальных переменных объявленных в DLL. Спа! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 17:16:54 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Выделять память в DLL можно, но и освобождать память можно только в этой же DLL. Правило такое - освобождать память можно только в том модуле, в котором ты его создал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 18:50:41 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
То есть я хотел сказать: smskinВыделять память в DLL можно, но и освобождать память можно только в этой же DLL. Правило такое - освобождать память можно только в том модуле, в котором ты её выделил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 18:52:04 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
smskinВыделять память в DLL можно, но и освобождать память можно только в этой же DLL. Правило такое - освобождать память можно только в том модуле, в котором ты её выделил.Это не совсем правда. Можно и в разных, никаких препятствий тут нету. Но если взять себе за правило освобождать в том же модуле в котором выделил, то жить будет проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2007, 21:03:05 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
White Owl wrote: >> smskin >> Выделять память в DLL можно, но и освобождать память можно только в этой >> же DLL. Правило такое - освобождать память можно только в том модуле, в >> котором ты её выделил. > > Это не совсем правда. Можно и в разных, никаких препятствий тут нету. > Но если взять себе за правило освобождать в том же модуле в котором > выделил, то жить будет проще. Лучше сказать так - это вполне возможно, и зависит от компилятора и от режима компиляции. Например, в MSVCRT от VS6 отдельный хип (похоже, что и в VS2005 - тоже). И если слинковать dll со статической библиотекой (LIBC, LIBCMT), а exe - с MSVCRT (или две разных dll, слинкованные со статической библиотекой), то нельзя смешивать malloc/free, функции, работающие с FILE* и т.п. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2007, 00:48:25 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
smskin пишет: > Выделять память в DLL можно, но и освобождать память можно только в этой > же DLL. Правило такое - освобождать память можно только в том модуле, в > котором ты его создал. Это неправда. Выделять и освобождать память можно (и нужно иногда ) в любом исполняемом модуле данного процесса. Нужно только чтобы соблюдалось одно условие - менеджер памяти, с помощью которого память выделяется, и менеджен памяти, с помощью которого она освобождается, должны быть одним и тем же менеджером памяти. Возможна даже ситуация, когда в приложении (процессе) одновременно используются несколько менеджеров памяти. Это нормальная ситуация и ничего плохого тут нет. В Win32 это вообще типичная ситуация - каждое приложение на С/С++ как правило использует два менеджера памяти - из стандартной библиотеки С и из Win32. А может быть оно еще использует и свои менеджеры. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2007, 14:15:40 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Это не совсем правда. Можно и в разных, никаких препятствий тут нету. Это - СОВСЕМ НЕПРАВДА, а не "не совсем правда". > Но если взять себе за правило освобождать в том же модуле в котором > выделил, то жить будет проще. Это может быть вообще невозможно в каких-то приложениях. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2007, 14:17:02 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Zmeishe пишет: Вообще возможно выделять память в Dll динамически ? Может ключики какие > компилятору сообщить нада ? Можно. Прото ты наверное используешь в каких-то DLL статическую CRTL. Если ты используешь DLL-и и выделяешь и удаляешь память в разных выполняемых модулях, то у тебя для этих модулей должен быть один и тот же C-шный рантайм (менеджер памяти). Т.е. в данном случае ты должен использовать реализацию CRTL в виде .DLL, а не статическую. Во всех модулях. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2007, 14:20:31 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Прото ты наверное используешь в каких-то DLL статическую CRTL. Если честно - я не знаю чего там используется. Я весь софт перевожу под Linux. С БД и сервером приложений уже закончил. Клиента так быстро не могу. Для этого в Win клиентском приложении на C++Builder создал своих наследников от TCustomRemoteServer и от TClientDataSet. Но сжимать/разжимать данные на Builder так чтобы понимал сервер, который на Qt не получилось. Сделал проще - сваял на Qt под win dll-ку, а из bpl её вызываю через LoadLibrary - всё Ok. Но выделять память в dll, а очищать в bpl не получилось. Вернее два раза получилось на на третий всё - АБЗАЦ. MasterZivу тебя для этих модулей должен быть один и тот же C-шный рантайм (менеджер памяти). Вот теперь понимаю почему вышел АБЗАЦ. BPL - сделана компилятором Borland DLL - сделана компилятором MinGW Нутром чую - у них разные менеджеры памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2007, 12:22:42 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Zmeishe пишет: > Если честно - я не знаю чего там используется. Это плохо, ты ДОЛЖЕН это знать. > Вот теперь понимаю почему вышел АБЗАЦ. > BPL - сделана компилятором Borland > DLL - сделана компилятором MinGW > Нутром чую - у них разные менеджеры памяти. Наверняка. Тут еще можно попробовать сделать такое. Во всех приличных С-шных библиотеках, которые пользуются динамической памятью, полагается иметь возможность задавать функции распределения памяти, которые используются. Поищи, может есть они в твоих проблемных библиотеках. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2007, 14:06:30 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
MasterZivПоищи, может есть они в твоих проблемных библиотеках. Смысла нет так глубоко копать. Я решил проблему добавлением глобальной переменной. 1-я функция делает zip и скидывает его в этот глобальный буфер, а на клиента возвращает размер. Клиент выделяет память и во вторую функцию подаёт указатель, чтоб забрать содержимое буфера. Вот код DLL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Вот код в BPL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Меня только смущала глобальная переменная в DLL. Поэтому я пытался выделить память в функциях Compress/Uncompress, а освобождать в BPL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2007, 14:57:38 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Zmeishe wrote: > Автор: "Zmeishe" > MasterZiv > Поищи, может есть они в твоих проблемных библиотеках. > > > Смысла нет так глубоко копать. > Я решил проблему добавлением глобальной переменной. > 1-я функция делает zip и скидывает его в этот глобальный буфер, а на > клиента возвращает размер. > Клиент выделяет память и во вторую функцию подаёт указатель, чтоб > забрать содержимое буфера. Обычной способ решения - это сделать в той же DLL функцию, освобождающую память обратно. Например: DLL: Код: plaintext Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2007, 17:19:23 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
Не выделяйте память маллоком пользуйте апишные функции ...... А то можно с такими делами столкнуться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2007, 16:56:57 |
|
||
|
Как динамически выделить память в DLL ?
|
|||
|---|---|---|---|
|
#18+
cap83 пишет: > Не выделяйте память маллоком пользуйте апишные функции ...... А то можно > с такими делами столкнуться Это вовсе не обязательно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2007, 13:18:35 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34922701&tid=2027818]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
200ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 544ms |

| 0 / 0 |
