Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
11-1130734441
Reset
2005-10-31 07:54
2006.07.23
Убрать PopupMenu, если оно уже "вывалилось"?


1-1149670151
Creative_ltd
2006-06-07 12:49
2006.07.23
загрузка картинки из DLL


15-1149995690
Black Angel
2006-06-11 07:14
2006.07.23
Не могу поставит Delphi 8


15-1150977103
TUser
2006-06-22 15:51
2006.07.23
USB-вентиляторы


2-1151954606
Ivolg
2006-07-03 23:23
2006.07.23
Окна