Поделиться через


Top-Level и внедренные указатели

Чтобы понять, как выделяются указатели и связанные с ними элементы данных в Microsoft RPC, необходимо различать указатели верхнего уровня и внедренные указатели. Также полезно ссылаться на набор всех указателей, которые не являются указателями верхнего уровня.

Указатели верхнего уровня — это указатели , указанные в качестве имен параметров в прототипах функций. Указатели верхнего уровня и их ссылки всегда выделяются на сервере.

Внедренные указатели — это указатели, внедренные в структуры данных, такие как массивы, структуры и объединения. Если внедренные указатели записывают выходные данные только в буфер и имеют значение NULL при входе, серверное приложение может изменить свои значения на ненулевое. В этом случае клиентские заглушки выделяют новую память для этих данных.

Если внедренный указатель на клиенте перед вызовом не имеет значения NULL, заглушки не выделяют память клиенту при возврате. Вместо этого заглушки пытаются записать память, связанную с внедренным указателем, в существующую память на клиенте, связанном с этим указателем, перезаписав уже там данные.

Примечание

Для данных, считывающихся из буфера или записываемых в них и не указывающих размер буфера, длина выходных данных должна быть меньше или равна входной длине. При обнаружении переполнения возникает исключение RPC. Для строковых данных длина выходных данных определяется проверкой длины входной строки. Таким образом, длина выходных строк не может превышать длину входных строк. Рекомендуется избежать этого, всегда включив параметр, заданный размером, чтобы указать размер буфера.

 

Внедренные указатели только для записи рассматриваются в разделе Объединение атрибутов указателя и направления.

Термин nontop-level pointers относится ко всем указателям, которые не указаны в качестве имен параметров в прототипе функции, включая как внедренные указатели, так и несколько уровней вложенных указателей.