Правила проектирования интерфейса
В этом разделе содержится краткое описание правил и рекомендаций по проектированию интерфейса. Некоторые из этих правил относятся к архитектуре 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 и используйте параметр out, а не HRESULT, чтобы вернуть сведения, относящиеся к вызову функции.
Дополнительные сведения см. в следующих разделах:
См. также