Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
6-1142107910
Daimyo
2006-03-11 23:11
2006.07.23
кодировка и indy


1-1149649436
_HAWK_
2006-06-07 07:03
2006.07.23
Как перевести на WinAPI?


3-1147940849
AlexeyK
2006-05-18 12:27
2006.07.23
ошибка при закрытии пустого ADOQuery


1-1149831321
DmiSb
2006-06-09 09:35
2006.07.23
Как сделать меню в стиле Delphi7 ?


2-1152030910
J_SABER
2006-07-04 20:35
2006.07.23
доступ к файлам в запароленном архиве





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский