Правила проектирования интерфейса
В этом разделе содержится краткое описание правил и рекомендаций по проектированию интерфейса. Некоторые из этих правил относятся к архитектуре COM, а другие — ограничения, введенные языком проектирования интерфейса, MIDL. Дополнительные сведения о проектировании com-интерфейса см. в разделе Анатомия файла IDL.
По определению объект не является com-объектом, если он не реализует интерфейс IUnknown или интерфейс, производный от IUnknown. Кроме того, следующие правила применяются ко всем интерфейсам, реализованным в com-объекте:
- У них должен быть уникальный идентификатор интерфейса (IID).
- Они должны быть неизменяемыми. После создания и публикации их определение не может измениться.
- Все методы интерфейса должны возвращать значение HRESULT, чтобы части системы, обрабатывающей удаленную обработку, могли сообщать об ошибках RPC.
- Все строковые параметры в методах интерфейса должны быть Юникодом.
- Типы данных должны быть переизменяемыми. Если вы не можете преобразовать тип данных в неизменяемый тип, вам придется создать собственные маршалинг и отменяющие процедуры. Кроме того, LPVOIDили void *, не имеет смысла на удаленном компьютере. При необходимости используйте указатель на IUnknown.
Заметка
Текущая реализация MIDL не обрабатывает перегрузку функций или несколько наследование.
Рекомендации по проектированию других интерфейсов
Используйте указатели на данные очень тщательно. Чтобы повторно создать данные в адресном пространстве вызываемого процесса, время выполнения RPC должно знать точный размер данных. Например, если параметр CHAR * указывает на буфер символов, а не на один символ, то данные не могут быть правильно созданы заново. Используйте синтаксис, доступный в MIDL, чтобы точно описать структуры данных, представленные определениями типов.
Инициализация необходима для указателей, внедренных в массивы и структуры и передаваемые через границы процесса. Неинициализированные указатели могут работать при передаче в программу в одном пространстве процессов, но прокси-серверы и заглушки предполагают, что все указатели инициализированы допустимыми адресами или имеют значение NULL.
Будьте осторожны при псевдонимах указателей (позволяя указателям указывать на одну и ту же часть памяти). Если псевдоним намеренно, эти указатели должны быть объявлены псевдонимами в файле IDL. Указатели, объявленные как некалиазуемые, никогда не должны псевдонимировать друг друга.
Обратите внимание на то, как выделить и освободить память. Помните, что, если вы явно не сообщаете COM-объекту (с помощью выделить атрибут) не освобождать структуру данных, созданную во время внепроцессного вызова, эта структура будет уничтожена после завершения вызова. Кроме того, рассмотрите потенциально разрушительные издержки, созданные неэффективным выделением структур данных, которые теперь необходимо маршалировать и немаршалировать.
Наконец, будьте осторожны при определении HRESULT возвращаемых значений, чтобы не создавать коды ошибок, конфликтующие с кодами com-определенных FACILITY_ITF (значения между 0x0000 и 0x01FF зарезервированы) или конфликтующие с другими значениями HRESULT с одинаковым значением. По возможности используйте универсальные значения возврата успешности и сбоя COM и используйте параметр , а не HRESULT, чтобы вернуть сведения, относящиеся к вызову функции.
Дополнительные сведения см. в следующих разделах:
Связанные разделы