![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL [D7]
fedpavel © (2006-03-10 15:32:00)Доброго времени суток Мастера.
Подскажите пожалуйста: у меня при выгрузке DLL выскакивает ошибка память не может быть прочитана по адресу 0х0000000.
Загрузка DLL: динамическая
var
H:HWDR;
f_ReadDel:function:Boolean;stdcall;
...
...
...
begin
H:=LoadLibrary('katini.dll');
if H<>0 then begin
f_ReadDel:=GetProcAddress(H,'f_ReadDel');
end;и при деактивации формы пишу следующее
While FreeLibrary(H) do;
Заранее спасибо!
Leonid Troyanovsky (2006-03-10 16:47:00) [1]
> Crash Coredump © (10.03.06 16:32) [25]
> А я по приведенному коду формы, засунутой куда-то, не увидел.
> ..Какое-то чтение из ini-файла и никакой формы.
А.. Я оказывается это пропустил в пол-глаза. Sorry.
Ну, все равно, sharemem и т.п. и т.д.
Ладно, думаю, fedpavel © меня извинит за ворчание,
все же, конец трудовой недели.
--
Regards, LVT.
Crash Coredump (2006-03-10 16:32:00) [2]
> Так ли уж нужно было
> засовывать эту форму в столь суровое место, чтобы с такими
> приседаниями ее показать (а, возможно, не показать).
А я по приведенному коду формы, засунутой куда-то, не увидел...Какое-то чтение из ini-файла и никакой формы.
Leonid Troyanovsky (2006-03-10 16:27:00) [3]
> Crash Coredump © (10.03.06 16:03) [17]
> В COM и в .NET тоже Dll есть...
Dll - dll рознь (дык, хоть bpl). Не в том вопрос.
Как, скажем, данное обсуждение. Так ли уж нужно было
засовывать эту форму в столь суровое место, чтобы с такими
приседаниями ее показать (а, возможно, не показать).
Надеюсь, что хоть модально покажут.
--
Regards, LVT.
fedpavel (2006-03-10 16:18:00) [4]
> Leonid Troyanovsky
Спасибо
fedpavel (2006-03-10 16:17:00) [5]
> Сергей М
Спасибо
Leonid Troyanovsky (2006-03-10 16:14:00) [6]
> fedpavel © (10.03.06 16:02) [15]
> Стремление берется из-за бонального: хочется понять как
> работать с DLL, а вот что впихивать туда это уже другой
> вопрос.
Работают с dll обычным образом - читают SDK, описывают
монстроидальные структуры, и зажмурив глаза делают вызовы,
из всех сил стараясь не материться.
Про впихивание тоже все понятно: какие бы страшные структуры не
использовались, они сводятся к простым (всем-всем понятным) типам,
скажем, PCHAR, DWORD, BOOL etc, причем, буфер для этих монстров
обычно готовит вызывающая сторона, которая также задумывается
о соглашении о вызовах, манглировании и проч. прелестях.
Т.е., про такие вещи как классы, объекты, свойства, формы и т..д.,
лучше даже не вспоминать. Вот такая суровая правда о dll.
--
Regards, LVT.
Сергей М. (2006-03-10 16:13:00) [7]
> мне не нравится что она будет занимать память
И правильно что не нравится.
Грузи модуль лишь при реальной необходимости его использования.
fedpavel (2006-03-10 16:09:00) [8]Всем большое СПАСИБО!!!
Я поместил в главную форму загрузку данной библиотеки и естественно прога сама выгружает её нормально, но есть одно но: мне не нравится что она будет занимать память, а пользователь может ведь туда даже и не заглянуть.
Ну что-нибудь придумаем!
Еще раз спасибо.
Сергей М. (2006-03-10 16:04:00) [9]
> fedpavel © (10.03.06 15:59) [14]
А в чем удовольствие грузить/выгружать модуль всякий раз при получении/потере формой фокуса ?
Мало ли сколько раз в секунду юзеру приспичит переключаться между открытыми окнами !
Загрузи модуль при создании формы, выгрузи при уничтожении ...
Crash Coredump (2006-03-10 16:03:00) [10]
> dll предназначены
> вовсе не для этого - это тяжелое наследие мрачных времен,
> лучше
> займитесь чем-нибудь полезным - изучайте COM, .NET
В COM и в .NET тоже Dll есть...
olegus81 (2006-03-10 16:03:00) [11]sFile:=ExtractFilePath(Application.ExeName)+'\katalog.ini';
if FileExists(sFile) then INI:=TIniFile.Create(sFile);
f_ReadDel:=StrToBool(INI.ReadString('Delite','DeliteInformation',''));
ExtractFilePath(Application.ExeName)- Возвращает C:\project\my\ и Еще +'\katalog.ini' получаем C:\project\my\\katalog.ini такой файл не найден
FileExists(sFile) = false
объект INI не создан
обращение к пустой переменной = Любимая ошибка
и в DLL Application другой не из проекта а свой новый Дллошный
fedpavel (2006-03-10 16:02:00) [12]Стремление берется из-за бонального: хочется понять как работать с DLL, а вот что впихивать туда это уже другой вопрос. Конечно код рабочий просто...
fedpavel (2006-03-10 15:59:00) [13]загрузка библиотеки происходит при активации формы.
пробовал выгружать и при закрытии формы.
Причем если библиотеку не закрывать, то сам проект закроет её замечательно, но если самому то... Просто открыть форму пользователь может неоднократно.
Хотя я сейчас попробую открыть библиотеку при загрузке главной формы...
Leonid Troyanovsky (2006-03-10 15:59:00) [14]
> Сергей М. © (10.03.06 15:36) [1]
> Самое интересное - в потрохах этой DLL ...
Там ничем не лучше, чем снаружи.
Самое интересное - это откуда берется маниакальное стремление
к впихиванию (возможно) работоспособного кода в библиотеки.
Уверен, что сколько-нибудь рационального объяснения ни у кого
из страждующих нет.
Так и хочется сказать: люди, одумайтесь - dll предназначены
вовсе не для этого - это тяжелое наследие мрачных времен, лучше
займитесь чем-нибудь полезным - изучайте COM, .NET, XML, играйте
в футбол или вышивайте крестиком.
--
Regards, LVT.
Сергей М. (2006-03-10 15:58:00) [15]
> прописа ini.free то же самое
Немудрено.
Отсутствие ini.free ведет только к утечке памяти, но никак не к исключению при выгрузке.
fedpavel (2006-03-10 15:56:00) [16]прописа ini.free то же самое
Сергей М. (2006-03-10 15:55:00) [17]
> fedpavel © (10.03.06 15:32)
> при деактивации формы
Что есть "деактивация формы" ? Потеря фокуса или что ?
В какой момент LoadLibrary выполняется ?
Crash Coredump (2006-03-10 15:52:00) [18]fedpavel © (10.03.06 15:46) [6]
А Ini.Free ?
Сергей М. (2006-03-10 15:50:00) [19]
> Sergey Masloff (10.03.06 15:43) [4]
> Что ЭТОТ цикл делает автору понятно?
Счетчик ссылок он таким образом пытается декрементировать до нуля (в предположении что LoadLibrary перед этим вызывалась заранее неизвестное число раз) с целью фактической выгрузки модуля
fedpavel (2006-03-10 15:48:00) [20]Цикл убираю то же самое. У меня в начале было просто:
FreeLibrary(H)