Предотвращение скрытия информации
Иногда программы намеренно или непреднамеренно скрывают информацию от движка маршалинга RPC. Ниже приведены некоторые примеры.
- Отправка структуры данных в виде неифференцированного блока байтов
- Увеличение производительности за счет использования побочных эффектов метода для передачи дополнительных данных по каналу связи.
- Попытка замаскировать дескриптор, передавая его в виде DWORD или ULONG
Эти методы практически гарантированно создают проблемы совместимости даже перед переносом приложения в 64-разрядную версию Windows.
Вместо отправки контекста сервера в качестве DWORD в стандартном удаленном вызове процедуры используйте дескриптор контекста, чтобы предоставить непрозрачный дескриптор контексту сервера, который хранится от имени клиента. Контексты определяются идентификаторами GUID, определенными временем выполнения RPC, когда сервер создает дескриптор контекста для клиента. Указатель не используется по проводу, и операция полностью прозрачна в 32-разрядных или 64-разрядных границах. Дополнительные сведения об использовании дескрипторов контекста см. в разделе Контекстные дескрипторы.
Интерфейсы DCOM не могут использовать дескрипторы контекста, так как COM обеспечивает управление собственным контекстом. Вместо создания дескриптора контекста можно передать указатель интерфейса в COM-объект. Затем можно вызвать методы непосредственно через указатель интерфейса или поместить указатель внутри других вызовов. Чтобы освободить объект сервера, клиент вызывает метод release интерфейса через указатель интерфейса.
Опять же, может возникать время, когда невозможно изменить исходную структуру кода, который вы переносите. Если нет способа избежать отправки указателя по сети в качестве DWORD, необходимо реализовать некоторое сопоставление на стороне сервера между DWORD значениями и указателями. Одним из способов этого является изменение указателей в клиентском приложении на типы точности указателей, например ULONG_PTR или DWORD_PTR. Затем используйте атрибут MIDL [call_as], чтобы поместить указатели на провод как значения DWORD. Оболочка на стороне клиента должна передавать только аргументы. Оболочка на стороне сервера обрабатывает сопоставление обоих типов. Аналогичным образом можно использовать атрибут [transmit_as] или атрибут [represent_as] для преобразования данных в формат, совместимый с обратной совместимостью для представления провода.
Если совместимость с обратной связью не является проблемой или если дескриптор не используется для удаленных вызовов, и вы уверены, что удаленные вызовы между 32-и 64-разрядными процессами никогда не будут происходить, вы можете переопределить аргумент как ULONG64. При необходимости, вы можете модифицировать 32-разрядное приложение, чтобы передать DWORD пользователю. Кроме того, можно создавать отдельные заглушки из отдельных файлов IDL для каждой платформы с помощью DWORD в 32-разрядной версии Windows и ULONG64 в 64-разрядной версии Windows.