Изменение существующего интерфейса

По возможности реализуйте новый интерфейс для приложения, а не вносите изменения в существующий. Если вы не можете избежать изменения существующего интерфейса, используйте новые типы данных только в новых методах. Знакомство с новым типом данных или изменение существующего типа является наиболее распространенным источником проблем несовместимости. Модель времени выполнения RPC предполагает, что принимающее приложение знает о типах получаемых данных, поэтому данные помещается в провод без универсального описания данных. Когда получатель ожидает другого типа данных, отличного от того, что отправитель положил на проводную передачу, заглушка вызывает исключение (или передача завершается ошибкой в другом менее корректном режиме).

Интерфейс RPC определяется его UUID и его основными и дополнительными номерами версий. При изменении существующего интерфейса необходимо добавить новые методы в конце интерфейса и изменить дополнительный номер версии. Если вы добавляете методы в любом месте или вносите другие изменения в интерфейс, вам также потребуется изменить основной номер версии.

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

Существует аналогичное обходное решение для одного специального случая изменения типа данных в существующем методе. Если у вас есть объединения, ветви которых являются указателями и которые не имеют ветви по умолчанию для нераспознанных типов, можно добавить новую ветвь, использующую новый тип данных. Это не изменит размер структуры данных. Когда клиент взаимодействует с новым сервером, он может использовать новый тип данных. Однако, когда клиент взаимодействует со старым сервером, время выполнения вызовет исключение RPC_S_INVALID_TAG. Опять же, вам потребуется написать клиентский код для правильной обработки этого исключения.

Интерфейс DCOM определяется идентификатором GUID. В DCOM интерфейсы считаются неизменяемыми, и вы можете вносить изменения только путем создания нового интерфейса, наследуемого от старого. Эти правила гарантируют, что клиенты и серверы остаются совместимыми.