Форум: "Начинающим";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
ВнизFreeLibrary Найти похожие ветки
← →
Александра (2006-07-03 21:08) [0]Привет! А почему функция FreeLibrary (HandleDll) не обнуляет HandleDll? Я его должна сама обнулить?
← →
begin...end © (2006-07-03 21:15) [1]> Александра (03.07.06 21:08) [0]
> А почему функция FreeLibrary (HandleDll) не обнуляет HandleDll?
Хотя бы потому, что HandleDll передаётся в FreeLibrary по значению, а не по ссылке.
> Я его должна сама обнулить?
Если это требуется, то да.
← →
Юрий Зотов © (2006-07-03 22:35) [2]> Александра (03.07.06 21:08)
А почему она должна его обнулять?
И каким образом функция может обнулить параметр, переданный ей не по ссылке?
← →
Rouse_ © (2006-07-04 11:11) [3]
> И каким образом функция может обнулить параметр, переданный
> ей не по ссылке?
Если вызывать с параметром в виде переменной, то:procedure EmtyByVal(const Param: Integer);
asm
xor esi, esi
end;
← →
Ketmar © (2006-07-04 11:22) [4]э-э-э... и что? ну, поломали мы регистр, который ломать нельзя. как следует из документации, "результат непредсказуем".
← →
Rouse_ © (2006-07-04 11:25) [5]Я же сказал - в случае, если через переменную. В дальнейшем при первом обращении к переменной ее значение будет браться из esi.
А пример был на слова "каким образом?"
← →
Игорь Шевченко © (2006-07-04 12:11) [6]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 13:17) [7]
> Игорь Шевченко © (04.07.06 12:11) [6]
Я же сказал, пример был на слова "каким образом?"
В твоем случае передается через ebx, его и чистим...
Я же не сказал что очищает любой переданный параметр, я показал как очистить параметр :)
← →
Игорь Шевченко © (2006-07-04 13:35) [8]Rouse_ © (04.07.06 13:17) [7]
> В твоем случае передается через ebx, его и чистим...
Зачем чистить то, через что передается ? Это неразумный метод. Чистить надо саму переменную, а не регистр, в который помещено значение этой переменной.
← →
Rouse_ © (2006-07-04 13:42) [9]Переменная содержиться на данный момент либо в стеке либо в одном из регистров.
Посему делаем так: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;
← →
Rouse_ © (2006-07-04 13:43) [10]В смысле не на данный момент, а на момент вызова функции...
← →
Игорь Шевченко © (2006-07-04 13:46) [11]
> Переменная содержиться на данный момент либо в стеке либо
> в одном из регистров.
Саша, если цель "очистить на данный момент", то вполне подойдет решение Param := 0 внутри функции EmptyParam, или вместо вызова этой функции :)
← →
Rouse_ © (2006-07-04 13:47) [12]:))) Ок, согласен :)
← →
Александра (2006-07-04 16:06) [13]А если я возьму и ещё раз FreeLibrary (HandleDll)? Система случайно не выгрузит левую библиотеку?
← →
Джо © (2006-07-04 16:07) [14]> [13] Александра (04.07.06 16:06)
> А если я возьму и ещё раз FreeLibrary (HandleDll)? Система
> случайно не выгрузит левую библиотеку?
В чем проблема? никак не пойму. После FreeLibrary сделать HandleDll := 0 сложно?
← →
Ketmar © (2006-07-04 16:35) [15]>Александра (04.07.06 16:06) [13]
система не так глупа, как это кажется на первый взгляд.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c