Odysseos Цитата: Кроме того - я бы в функциях MagGetXXX var-параметры заменил на const. На уровне скомпилированного кода разницы не будет - но вот с точки зрения логики программ на Pascal/Delphi оно будет явно точней.
Позволю себе не согласиться. использование
const-параметра подразумевает возможность передачи вместо указателя
nil. При использовании
var-параметра передача
nil в качестве указателя невозможна.
Пример. Берем ф-цию
BOOL WINAPI MagGetWindowSource(HWND hwnd, RECT *pRect); ее можно абсолютно точно описать двумя способами:
а) function MagGetWindowSource(hwnd: HWND;
const pRect: PRect): Boolean;
или
б) function MagGetWindowSource(hwnd: HWND;
var pRect: TRect): Boolean;
Исходя из смысла, ф-ция должна что-то вернуть в параметре pRect. Оба описания работоспособны, однако вариант
А допускает как вызов:
MagGetWindowSource(fhwnd,
@fRect);
так и вызов:
MagGetWindowSource(fhwnd,
nil);
и вот в таком случае у нас случится AV, когда ф-ция MagGetWindowSource попытается что-то в nil записать.
Однако бывают случаи, и часто, когда, согласно документации, ф-ция может принимать в качестве буфера не только указатель на выделенную память, но и nil (например, в схеме, когда первый раз ф-ция вызывается с nil и возвращает реально необходимую длину буфера, после чего мы выделяем нужную память и вызываем ф-цию второй раз, передав ей уже указатель на эту память). Обычно такой подход используется, когда буфер - строка символов. В таком случае параметр необходимо описывать именно как const-параметр.
Поэтому надо тщательно подходить к вопросу, какой тип выходного параметра использовать.
Насчет
Цитата: а в функциях MagSetXXX - var-параметры заменил на out
- без проблем, out - это тот же var, только не инициализированный на входе в ф-цию, хотя разницу между var и out знает только компилятор Дельфи. Для вызываемой внешней ф-ции между var и out разницы нет. Да и компилятор Дельфи такие параметры по-разному воспринимает только при передаче в качестве параметров динамических переменных - строк, массивов и при вызове методов интерфейсов. В остальных случаях разница между ними чисто эстетическая