Entwerfen von Remotable-Schnittstellen
Mit der Einführung des verteilten Komponentenobjektmodells ist es wichtig, dass Ihre benutzerdefinierte Schnittstelle remotable ist, auch wenn Sie sie nur prozessintern verwenden möchten.
MIDL ist mehr als nur eine Möglichkeit, Headerdateien für Ihre Schnittstellen zu generieren. Es ist eine Programmiersprache für Remoting, mit der Sie Ihre Schnittstellen über Computer-, Prozess- und Threadgrenzen hinweg verwenden können. Dies bedeutet, dass Sie das Verhalten Ihrer MIDL-definierten Schnittstellen unter diesen Bedingungen überprüfen müssen, bevor Sie Ihr Programm für Kunden freigeben. Wenn Sie in Ihrer IDL einen Fehler gemacht haben und die Schnittstelle nicht ordnungsgemäß remote ist, kann es schwierig sein, diesen Fehler zu beheben. Entweder müssen Sie Ihre Schnittstelle mit einer neuen IID überarbeiten und die alte aus Gründen der Abwärtskompatibilität in belassen, oder Sie müssen jeden Client und jeden Servercomputer gleichzeitig überall konvertieren.
Auch wenn Ihre Schnittstelle niemals außerhalb des Prozesses verwendet wird, kann sie threadübergreifend verwendet werden. Das größte Problem für eine nicht überprüfte IDL-Datei kann für In-Process-Server auftreten, die nicht mehrere Singlethread-Apartmentsunterstützen. Ein Server, der kein Threadingmodell angibt, ist implizit singlethreaded. Alles, was als Singlethread markiert ist, wird auf den Thread erzwungen, der zuerst CoInitialize oder CoInitializeExaufgerufen hat. Wenn es sich bei einem anderen Thread um den Thread handelt, der das Objekt aktiviert hat, müssen alle Schnittstellen auf diesem Singlethreadserver per Remotezugriff an den aktivierenden Thread zurückgesetzt werden. Dies kann zu einer Rückgabe von REGDB _ E _ IIDNOTREG als Reaktion auf einen Aufruf von QueryInterfaceführen. Wenn Sie nicht unbedingt bestätigen können, dass Ihre Schnittstelle sowohl prozessintern als auch immer im selben Thread aufgerufen wird, werden Sie zu einem bestimmten Zeitpunkt remote geschaltet.
Schließlich müssen Sie als Schnittstellen-Designer berücksichtigen, wie Clientanwendungen Ihre Schnittstelle verwenden. Zwei Dinge zusammen bestimmen, ob eine Schnittstelle über Prozess- und Computergrenzen hinweg effizient sein wird: die Häufigkeit von Methodenaufrufen über die Schnittstellengrenze hinweg und die Menge an Daten, die in einem bestimmten Methodenaufruf übertragen werden sollen. Obwohl COM prozess- und netzwerkübergreifende Aufrufe für Programme transparent macht, können Aufrufe mit hoher Frequenz und hoher Bandbreite nicht über Adressräume hinweg effizient sein. In einigen Fällen ist es besser, Schnittstellen zu entwerfen, die normalerweise nur als Prozessserver implementiert werden, während andere Schnittstellen besser für die Remoteverwendung geeignet sind.