![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeLibrary [D7, XP]
Александра © (2006-07-03 21:08:00)Привет! А почему функция FreeLibrary (HandleDll) не обнуляет HandleDll? Я его должна сама обнулить?
Ketmar (2006-07-04 16:35:00) [1]>Александра (04.07.06 16:06) [13]
система не так глупа, как это кажется на первый взгляд.
Джо (2006-07-04 16:07:00) [2]> [13] Александра (04.07.06 16:06)
> А если я возьму и ещё раз FreeLibrary (HandleDll)? Система
> случайно не выгрузит левую библиотеку?
В чем проблема? никак не пойму. После FreeLibrary сделать HandleDll := 0 сложно?
Александра (2006-07-04 16:06:00) [3]А если я возьму и ещё раз FreeLibrary (HandleDll)? Система случайно не выгрузит левую библиотеку?
Rouse_ (2006-07-04 13:47:00) [4]:))) Ок, согласен :)
Игорь Шевченко (2006-07-04 13:46:00) [5]
> Переменная содержиться на данный момент либо в стеке либо
> в одном из регистров.
Саша, если цель "очистить на данный момент", то вполне подойдет решение Param := 0 внутри функции EmptyParam, или вместо вызова этой функции :)
Rouse_ (2006-07-04 13:43:00) [6]В смысле не на данный момент, а на момент вызова функции...
Rouse_ (2006-07-04 13:42:00) [7]Переменная содержиться на данный момент либо в стеке либо в одном из регистров.
Посему делаем так:
procedure EmptyParam (const Param: Integer);
asm
push ebp
mov ebp, esp
test eax, eax
jz @@exit
push ebx
push ecx
push edx
push esi
push edi
xor edx, edx
@@loop:
mov ecx, [esp + edx]
cmp eax, ecx
je @@find
inc edx
jmp @@loop
@@find:
mov [esp + edx], 0
@@store:
pop edi
pop esi
pop edx
pop ecx
pop ebx
@@exit:
mov esp, ebp
pop ebp
end;
Игорь Шевченко (2006-07-04 13:35:00) [8]Rouse_ © (04.07.06 13:17) [7]
> В твоем случае передается через ebx, его и чистим...
Зачем чистить то, через что передается ? Это неразумный метод. Чистить надо саму переменную, а не регистр, в который помещено значение этой переменной.
Rouse_ (2006-07-04 13:17:00) [9]
> Игорь Шевченко © (04.07.06 12:11) [6]
Я же сказал, пример был на слова "каким образом?"
В твоем случае передается через ebx, его и чистим...
Я же не сказал что очищает любой переданный параметр, я показал как очистить параметр :)
Игорь Шевченко (2006-07-04 12:11:00) [10]Rouse_ © (04.07.06 11:11) [3]
procedure EmptyParam (const Param: Integer);
asm
xor esi,esi
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyParam: Integer;
begin
MyParam := 2;
EmptyParam (MyParam);
ShowMessageFmt ('param = %d', [MyParam]);
end;
Эта...не обнуляется совсем...
Rouse_ (2006-07-04 11:25:00) [11]Я же сказал - в случае, если через переменную. В дальнейшем при первом обращении к переменной ее значение будет браться из esi.
А пример был на слова "каким образом?"
Ketmar (2006-07-04 11:22:00) [12]э-э-э... и что? ну, поломали мы регистр, который ломать нельзя. как следует из документации, "результат непредсказуем".
Rouse_ (2006-07-04 11:11:00) [13]
> И каким образом функция может обнулить параметр, переданный
> ей не по ссылке?
Если вызывать с параметром в виде переменной, то:
procedure EmtyByVal(const Param: Integer);
asm
xor esi, esi
end;
Юрий Зотов (2006-07-03 22:35:00) [14]> Александра (03.07.06 21:08)
А почему она должна его обнулять?
И каким образом функция может обнулить параметр, переданный ей не по ссылке?
begin...end (2006-07-03 21:15:00) [15]> Александра (03.07.06 21:08) [0]
> А почему функция FreeLibrary (HandleDll) не обнуляет HandleDll?
Хотя бы потому, что HandleDll передаётся в FreeLibrary по значению, а не по ссылке.
> Я его должна сама обнулить?
Если это требуется, то да.