Access 2002

Передача параметров по ссылке и по значению


Аргументы могут передаваться в DLL двумя способами: по ссылке и по значению. При передаче аргумента по значению в стек помещаются копии данных (строки, числа и т. п.). При передаче аргумента по ссылке в стек помещается адрес передаваемых данных. По умолчанию VBA передает аргументы по ссылке. В языке С, наоборот, по умолчанию аргументы передаются по значению. Имейте это в виду, когда будете строить оператор Declare на основании документации: поскольку DLL обычно написаны на С, документация тоже следует соглашениям этого языка. И если способ передачи параметра в документации не указан, значит, вам нужно явно указать, что параметр передается по значению.

С практической точки зрения разница между передачей параметра по ссылке и по значению такова.

Когда вы передаете параметр по значению, указав в вызове функции переменную, в которой он хранится, в стек помещается копия значения этой переменной. Любые изменения, вносимые DLL в переданные вами данные, затрагивают только эту копию и не отражаются на данных в вашем коде — содержимое вашей переменной остается неизменным.

Когда вы передаете параметр по ссылке, указав в вызове функции переменную, в которой он хранится, в стек помещается адрес этой переменой. Любые изменения, вносимые DLL в переданные вами данные, отражаются на данных в вашем коде — можно сказать, что DLL работает непосредственно с вашей переменной.

IpFileSize остается там же, где и было: в стек помещается только его адрес (передача по ссылке). Очень важно помнить, что аргументы функции всегда должны быть объявлены так, как она их получает.

Комментарии закрыты