Проектирование Remotable Interfaces
С появлением объектной модели распределенного компонента важно, чтобы пользовательский интерфейс был переизменяем, даже если вы планируете использовать его только в процессе.
MIDL — это не просто способ создания файлов заголовков для интерфейсов. Это язык программирования для удаленного взаимодействия, который позволяет использовать интерфейсы между компьютерами, процессами и границами потоков. Это означает, что перед выпуском программы клиентам необходимо проверить поведение определяемых MIDL интерфейсов в этих условиях. Если вы сделали ошибку в IDL и интерфейс не удален правильно, это может быть трудно исправить эту ошибку. Необходимо изменить интерфейс с помощью нового iiD и оставить старый для обратной совместимости или преобразовать каждый клиент и каждый серверный компьютер в одно и то же время.
Даже если интерфейс никогда не будет использоваться вне процесса, его можно использовать между потоками. Наихудшая проблема для файла IDL без проверка может возникнуть для серверов в процессе, которые не поддерживают несколько однопоточных квартир). Сервер, не указывающий модель потоков, неявно является однопотоковой. Все помеченное однопотоковое принудительно переключается на поток, который сначала называется CoInitialize или CoInitializeEx. Если другой поток был тем, который активировал объект, все интерфейсы на этом однопоточном сервере должны быть удалены обратно в активирующий поток, что может привести к возвращению REGDB_E_IIDNOTREG в ответ на вызов QueryInterface). Если вы не можете абсолютно утверждать, что интерфейс находится как в процессе, так и всегда будет вызываться в одном потоке, вы будете удалены в некоторое время.
Наконец, в качестве конструктора интерфейсов необходимо рассмотреть, как клиентские приложения будут использовать ваш интерфейс. Вместе определите, будет ли интерфейс эффективным в пределах процесса и компьютера: частота вызовов методов через границу интерфейса и объем данных, передаваемых в заданном вызове метода. Хотя COM делает межпроцессные и межсетовые вызовы прозрачными для программ, он не может сделать высокочастотные и высокоскоростные вызовы с высокой пропускной способностью в адресных пространствах. В некоторых случаях более подходящим является проектирование интерфейсов, которые обычно будут реализованы только как серверы внутри процесса, а другие интерфейсы более подходящи для удаленного использования.