![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeLibrary [D6, XP]
psa247 © (2006-01-07 11:27:00)Добрый день, подскажите почему при каждом использовании этого фрагмента кода у меня растет количество открытых дескрипторов:
SomeButtonClick(...)
begin
HMyDll:= LoadLibrary('My.dll');
@MyDll:= GetProcAddress(HMyDll, 'Hook');
if Assigned(@MyDll)then MyDll(True, 12345);
if HMyDll<>0 then FreeLibrary(HMyDll);
end;
sniknik (2006-01-07 17:48:00) [1]> В [1], если процедура подгружена, LoadLibrary вызывается снова.
да. ;( и сдесь спутал...
begin...end (2006-01-07 17:43:00) [2]> Надо <> 0.
В смысле, если <> 0, то ошибки нет. А в [1] тогда надо "= 0".
begin...end (2006-01-07 17:41:00) [3]> sniknik © (07.01.06 17:37) [3]
> "идея" - проверка на not nil. если не nil значит кнопочку
> уже нажимали и процедура подгружена.
В [1], если процедура подгружена, LoadLibrary вызывается снова.
> наоборот. знак спутал. надо <
Не надо. Надо <> 0.
psa247 (2006-01-07 17:38:00) [4]В этом необходимость (грузить/выгружать)
> sniknik © (07.01.06 16:52) [1]
sniknik (2006-01-07 17:37:00) [5]> Э-э-э... Можно пояснить?
так в > psa247 © (07.01.06 11:27) написано, составлял сдесь "кусками". "идея" - проверка на not nil. если не nil значит кнопочку уже нажимали и процедура подгружена.
> Типа, DLL может загружаться только по адресам, меньшим 32? Оригинально.
наоборот. знак спутал. надо <
begin...end (2006-01-07 17:01:00) [6]> sniknik © (07.01.06 16:52) [1]
> if Assigned(@MyDll) then begin
> HMyDll:= LoadLibrary('My.dll');
Э-э-э... Можно пояснить?
> if HMyDll >= 32 then Raise Exception.Create(xxx);
Типа, DLL может загружаться только по адресам, меньшим 32? Оригинально.
sniknik (2006-01-07 16:52:00) [7]а зачем каждый раз dll грузить? сделай проверку по другому
SomeButtonClick(...)
begin
if Assigned(@MyDll) then begin
HMyDll:= LoadLibrary('My.dll');
if HMyDll >= 32 then Raise Exception.Create(xxx);
@MyDll:= GetProcAddress(HMyDll, 'Hook');
if not Assigned(@MyDll) then Raise Exception.Create(xxx);
end;
MyDll(True, 12345);
//if HMyDll<>0 then FreeLibrary(HMyDll); //освободится по завершении программы (можно и самому позаботится, но лишнее)
end;