Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2010, 23:03   #1
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
Вопрос как правильно выгрузить dll из памяти

у меня явное связывание с dll при вызове FreeLibrary иногда выскакивает ошибка.
Код:
 
var  DLL : THandle;  ss: string;
showform: procedure (var s: string);
begin
        DLL := LoadLibrary('Project7.dll');
        try

        @showform := GetProcAddress(dll, 'showform');
        ss:=form4.Edit7.Text;
        showform(ss);
        form4.Edit7.Text:=ss;

        finally
          FreeLibrary(DLL);  //здесь ошибка выскакивает
        end;
а выскакивает именно тогда когда возвращаемый параметр s<>'' то есть если в s пусто то ошибки нет
пауэрлифтинг вне форума Ответить с цитированием
Старый 04.04.2010, 23:13   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

что насчет string в DLL говорили?(и сколько уже раз)
юзаем PChar или ShortString
ошибка возникает не в FreeLibrary мне кажется, а вот что вы используете ресурсы из DLL(например строки)
если они вам нужны то копируйте их из памяти DLL в выделенную вами(либо разрабатывайте DLL чтоб она выделяла память для копий констант а не возвращала константы сами. но тогда надо в основной проге освобождать эту память)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.04.2010, 23:19   #3
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

я dll и программу создавал на одной версии делпхи тогда думаю со строками не должно быть проблем
пауэрлифтинг вне форума Ответить с цитированием
Старый 04.04.2010, 23:20   #4
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

WideString-и тоже можно безбоязненно гонять между exe и dll. Они не требуют ручного управления памятью (в отличие от PChar), не ограничены по длине (в отличие от ShortString), единственное что будет тратиться процессорное время на перевод в Ansi и обратно при присваивании обычным String-ам
Slovinsky вне форума Ответить с цитированием
Старый 04.04.2010, 23:21   #5
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Цитата:
тогда думаю со строками не должно быть проблем
А они будут, если менеджер памяти не расшаришь. Дело в том, что выделять память под строку и освобождать ее должен один и тот же менеджер памяти, а у DLL и EXE своя копия этого менеджера
Slovinsky вне форума Ответить с цитированием
Старый 04.04.2010, 23:25   #6
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

спасибо . поставил вместо String ShortString и все нормально заработало
пауэрлифтинг вне форума Ответить с цитированием
Старый 04.04.2010, 23:33   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
я dll и программу создавал на одной версии делпхи тогда думаю со строками не должно быть проблем
а вы читали коммент от Борланда в пустой DLL?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.04.2010, 23:41   #8
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

Пепел Феникса там не по нашему написано.

там еще про модуль ShareMem говориться который можно подключить чтоб чтоб строки работали
пауэрлифтинг вне форума Ответить с цитированием
Старый 04.04.2010, 23:58   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Пепел Феникса там не по нашему написано.
ну у меня англ это второй язык мой

вкратце там говорится что можно подключить(первым(это нужно) в uses у dll и у интерфейсного модуля к ней) и таскать с собою также ShareMem.dll и тогда можно использовать string обычный.

кстати насчет WideString я лично не уверен, ибо у него все-таки та же суть что и у простого string(кстати в Unicode Delphi(2009-2010(это то что я знаю точно)) string и UnicodeString одно и тоже, а в ANSI Delphi(1-7) string и ANSIstring)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 05.04.2010 в 02:15.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2010, 00:34   #10
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Цитата:
кстати насчет WideString я лично не уверен
Проверьте - тоже лично Секрет в том, что при работе с WideString-ами единство менеджера памяти гарантировано. WideString - это обертка над системным типом BSTR, который используется в COM/OLE и для выделения и освобождения памяти используется системный менеджер из oleout32.dll
Slovinsky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как выгрузить сайт в интернет steck Свободное общение 18 22.02.2011 13:47
Размещение DLL в памяти Windows Mobile Eagle Общие вопросы C/C++ 1 20.12.2009 16:53
Помогите советом! Как выгрузить форму из памяти? Bezdar Microsoft Office Excel 18 08.05.2009 13:06
Программно выгрузить DLL из памяти Air Помощь студентам 7 01.05.2008 00:06