Delen via


Interfaceontwerpregels

In deze sectie vindt u een kort overzicht van regels en richtlijnen voor interfaceontwerp. Sommige van deze regels zijn specifiek voor de COM-architectuur, terwijl andere beperkingen zijn opgelegd door de interfaceontwerptaal MIDL. Zie Anatomie van een IDL-bestandvoor meer informatie over com-interfaceontwerp.

Een object is per definitie geen COM-object tenzij het de IUnknown interface of een interface implementeert die is afgeleid van IUnknown-. Bovendien zijn de volgende regels van toepassing op alle interfaces die zijn geïmplementeerd op een COM-object:

  • Ze moeten een unieke interface-id (IID) hebben.
  • Ze moeten onveranderbaar zijn. Zodra ze zijn gemaakt en gepubliceerd, kan er geen deel van de definitie worden gewijzigd.
  • Alle interfacemethoden moeten een HRESULT--waarde retourneren, zodat de delen van het systeem die externe verwerking verwerken RPC-fouten kunnen rapporteren.
  • Alle tekenreeksparameters in interfacemethoden moeten Unicode zijn.
  • Uw gegevenstypen moeten extern zijn. Als u een gegevenstype niet kunt converteren naar een extern type, moet u uw eigen marshaling- en unmarshaling routines maken. Ook heeft LPVOID, of void *, geen betekenis op een externe computer. Gebruik indien nodig een aanwijzer om IUnknownte.

Notitie

De huidige implementatie van MIDL verwerkt geen overbelasting van functies of meerdere overnames.

 

Andere ontwerpoverwegingen voor interface

Gebruik pointers om gegevens zeer zorgvuldig te gebruiken. Als u de gegevens opnieuw wilt maken in de adresruimte van het proces dat wordt aangeroepen, moet de RPC-uitvoeringstijd de exacte grootte van de gegevens weten. Als bijvoorbeeld een CHAR * parameter verwijst naar een buffer met tekens in plaats van één teken, kunnen de gegevens niet correct opnieuw worden gemaakt. Gebruik de syntaxis die beschikbaar is met MIDL om de gegevensstructuren die worden vertegenwoordigd door uw typedefinities nauwkeurig te beschrijven.

Initialisatie is essentieel voor aanwijzers die zijn ingesloten in matrices en structuren en die worden doorgegeven aan procesgrenzen. Niet-geïnitialiseerde aanwijzers kunnen werken wanneer ze worden doorgegeven aan een programma in dezelfde procesruimte, maar proxy's en stubs gaan ervan uit dat alle aanwijzers worden geïnitialiseerd met geldige adressen of null zijn.

Wees voorzichtig bij het aliasen van aanwijzers (zodat pointers naar hetzelfde geheugen kunnen verwijzen). Als de alias opzettelijk is, moeten deze aanwijzers worden gedeclareerd als alias in het IDL-bestand. Aanwijzers die als niet-aliased zijn gedeclareerd, mogen elkaar nooit aliasen.

Let op hoe u geheugen toewijst en vrij hebt. Houd er rekening mee dat, tenzij u expliciet een COM-object vertelt (met behulp van het kenmerk toewijst) geen gegevensstructuur vrijmaakt die is gemaakt tijdens een out-of-process-aanroep, die structuur wordt vernietigd wanneer de aanroep is voltooid. Overweeg ook de potentieel destructieve overhead die is gecreëerd door inefficiënte toewijzing van gegevensstructuren die nu moeten worden marshaled en niet-gemarhaleerd.

Wees ten slotte voorzichtig bij het definiëren van uw HRESULT- retourwaarden, zodat u geen foutcodes maakt die conflicteren met door COM gedefinieerde FACILITY_ITF codes (waarden tussen 0x0000 en 0x01FF zijn gereserveerd) of die conflicteren met andere HRESULT- waarden met dezelfde waarde. Gebruik waar mogelijk de universele WAARDEN voor COM-succes en -fout en gebruik een parameter, in plaats van een HRESULT-, om informatie te retourneren die specifiek is voor de functieaanroep.

Zie de volgende onderwerpen voor meer informatie:

interfacedefinities en typebibliotheken