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


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

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

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

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

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

Заметка

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

 

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

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