Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
C++-specifieke
Wordt gebruikt om informatie uit een typebibliotheek op te nemen. De inhoud van de typebibliotheek wordt geconverteerd naar C++-klassen, met name een beschrijving van de COM-interfaces.
Syntaxis
#import "bestandsnaam" [kenmerken]
<#importBestandsnaam> [kenmerken]
Parameterwaarden
Bestandsnaam
Hiermee geeft u de typebibliotheek die moet worden geïmporteerd. De bestandsnaam kan een van de volgende soorten zijn:
De naam van een bestand dat een typebibliotheek bevat, zoals een OLB-, .tlb- of .dll-bestand. Het trefwoord,
file:kan voorafgaan aan elke bestandsnaam.De progid van een besturingselement in de typebibliotheek. Het trefwoord,
progid:kan voorafgaan aan elke progid. Voorbeeld:#import "progid:my.prog.id.1.5"Zie De lokalisatie-id en het versienummer opgeven voor meer informatie over progids.
Wanneer u een 32-bits cross-compiler gebruikt op een 64-bits besturingssysteem, kan de compiler alleen de 32-bits register hive lezen. Mogelijk wilt u de systeemeigen 64-bits compiler gebruiken om een 64-bits bibliotheek te bouwen en te registreren.
De bibliotheek-id van de typebibliotheek. Het trefwoord,
libid:kan voorafgaan aan elke bibliotheek-id. Voorbeeld:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")Als u dit niet opgeeft
versionoflcid, worden de toegepasteprogid:regels ook toegepast oplibid:.Een uitvoerbaar bestand (.exe).
Een bibliotheekbestand (.dll) met een typebibliotheekresource (zoals een .ocx).
Een samengesteld document met een typebibliotheek.
Elke andere bestandsindeling die kan worden begrepen door de LoadTypeLib-API .
kenmerken
Een of meer #import kenmerken. Scheid kenmerken met een spatie of komma. Voorbeeld:
#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
– of –
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
Opmerkingen
Zoekvolgorde voor bestandsnaam
bestandsnaam wordt optioneel voorafgegaan door een mapspecificatie. De bestandsnaam moet een naam voor een bestaand bestand hebben. Het verschil tussen de twee syntaxisformulieren is de volgorde waarin de preprocessor zoekt naar de typebibliotheekbestanden wanneer het pad onvolledig is opgegeven.
| Syntaxisformulier | Handeling |
|---|---|
| Formulier tussen aanquot | Hiermee wordt de preprocessor geïnstrueerd om eerst te zoeken naar type bibliotheekbestanden in de map van het bestand dat de #import instructie bevat, en vervolgens in de mappen van de bestanden die dat bestand bevatten (#include). De preprocessor zoekt vervolgens langs de paden die hieronder worden weergegeven. |
| Formulier hoekhaak | Hiermee geeft u de preprocessor de opdracht om te zoeken naar typebibliotheekbestanden langs de volgende paden: 1. De PATH lijst met omgevingsvariabelepaden2. De LIB lijst met padpaden voor omgevingsvariabelen3. Het pad dat is opgegeven door de optie /I-compiler , behalve dat de compiler zoekt naar een typebibliotheek waarnaar wordt verwezen vanuit een andere typebibliotheek met het kenmerk no_registry . |
Geef de lokalisatie-id en het versienummer op
Wanneer u een progid opgeeft, kunt u ook de lokalisatie-id en het versienummer van de progid opgeven. Voorbeeld:
#import "progid:my.prog.id" lcid("0") version("4.0)
Als u geen lokalisatie-id opgeeft, wordt een progid gekozen volgens de volgende regels:
Als er slechts één lokalisatie-id is, wordt die gebruikt.
Als er meer dan één lokalisatie-id is, wordt de eerste met versienummer 0, 9 of 409 gebruikt.
Als er meer dan één lokalisatie-id is en geen van deze id's 0, 9 of 409 is, wordt de laatste gebruikt.
Als u geen versienummer opgeeft, wordt de meest recente versie gebruikt.
Koptekstbestanden die zijn gemaakt door importeren
#import maakt twee headerbestanden waarmee de inhoud van de typebibliotheek in C++ broncode wordt gereconstrueerd. Het primaire headerbestand is vergelijkbaar met het bestand dat wordt geproduceerd door de MIDL-compiler (Microsoft Interface Definition Language), maar met extra code en gegevens die door de compiler zijn gegenereerd. Het primaire headerbestand heeft dezelfde basisnaam als de typebibliotheek, plus een . TLH extensie. Het secundaire headerbestand heeft dezelfde basisnaam als de typebibliotheek, met een . TLI-extensie. Het bevat de implementaties voor door compiler gegenereerde lidfuncties en is opgenomen (#include) in het primaire headerbestand.
Als u een dispinterface-eigenschap importeert die gebruikmaakt van byref parameters, genereert #import geen instructie __declspec(eigenschap) voor de functie.
Beide headerbestanden worden in de uitvoermap geplaatst die is opgegeven door de optie /Fo (naamobjectbestand). Ze worden vervolgens gelezen en gecompileerd door de compiler alsof het primaire headerbestand de naam heeft gekregen van een #include richtlijn.
De volgende compileroptimalisaties worden geleverd met de #import-instructie :
Het headerbestand, wanneer het wordt gemaakt, krijgt dezelfde tijdstempel als de typebibliotheek.
Wanneer #import wordt verwerkt, controleert de compiler eerst of de header bestaat en up-to-date is. Zo ja, dan hoeft deze niet opnieuw te worden gemaakt.
De #import richtlijn neemt ook deel aan minimale herbouw en kan worden geplaatst in een vooraf gecompileerd headerbestand. Zie Vooraf gecompileerde headerbestanden maken voor meer informatie.
Headerbestand van primaire typebibliotheek
Het primaire type bibliotheekheaderbestand bestaat uit zeven secties:
Standaard voor kop: bestaat uit opmerkingen,
#includeinstructie voor COMDEF. H (die enkele standaardmacro's definieert die in de koptekst worden gebruikt) en andere informatie over de installatie.Verwijzingen en typedefs doorsturen: bestaat uit structuurdeclaraties zoals
struct IMyInterfaceen typedefs.Declaraties van slimme aanwijzers: de sjabloonklasse
_com_ptr_tis een slimme aanwijzer. Het bevat interfaceaanwijzers en elimineert de noodzaak om aan te roepenAddRef,ReleaseenQueryInterfacefuncties. De aanroep wordt ook verborgen bij hetCoCreateInstancemaken van een nieuw COM-object. In deze sectie wordt de macro-instructie_COM_SMARTPTR_TYPEDEFgebruikt om typedefs van COM-interfaces tot stand te brengen als sjabloonspecialisaties van de _com_ptr_t-sjabloonklasse . Bijvoorbeeld voor interfaceIMyInterface, de . TLH-bestand bevat:_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));waarmee de compiler wordt uitgebreid naar:
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;Het type
IMyInterfacePtrkan vervolgens worden gebruikt in plaats van de onbewerkte interfacepointerIMyInterface*. Daarom is het niet nodig om de verschillendeIUnknownlidfuncties aan te roepenTypeinfo-declaraties: voornamelijk bestaat uit klassedefinities en andere items die de afzonderlijke typeinfo-items weergeven die worden geretourneerd door
ITypeLib::GetTypeInfo. In deze sectie wordt elke typeinfo uit de typebibliotheek weergegeven in de koptekst in een formulier dat afhankelijk is van deTYPEKINDinformatie.Optionele GUID-definitie in oude stijl: bevat initialisaties van de benoemde GUID-constanten. Deze namen hebben het formulier
CLSID_CoClassenIID_Interface, vergelijkbaar met de namen die zijn gegenereerd door de MIDL-compiler.#includeinstructie voor de koptekst van de secundaire typebibliotheek.Standaard voor voettekst: bevat
#pragma pack(pop)momenteel .
Alle secties, met uitzondering van de standaardsectie voor kopteksten en voetteksten, worden ingesloten in een naamruimte met de naam die is opgegeven door de library instructie in het oorspronkelijke IDL-bestand. U kunt de namen uit de koptekst van de typebibliotheek gebruiken door een expliciete kwalificatie te gebruiken met behulp van de naamruimtenaam. U kunt ook de volgende instructie opnemen:
using namespace MyLib;
direct na de #import instructie in de broncode.
De naamruimte kan worden onderdrukt met behulp van het kenmerk no_namespace) van de #import-instructie . Het onderdrukken van de naamruimte kan echter leiden tot naamconflicten. De naamruimte kan ook worden gewijzigd door het kenmerk rename_namespace .
De compiler biedt het volledige pad naar alle typebibliotheekafhankelijkheid die vereist is voor de typebibliotheek die momenteel wordt verwerkt. Het pad wordt geschreven in de vorm van opmerkingen in de koptekst van de typebibliotheek (. TLH) die de compiler genereert voor elke verwerkte typebibliotheek.
Als een typebibliotheek verwijzingen bevat naar typen die zijn gedefinieerd in andere typebibliotheken, dan de . TLH-bestand bevat opmerkingen van het volgende type:
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
De werkelijke bestandsnaam in de #import opmerking is het volledige pad van de bibliotheek met kruisverwijzingen naar het type, zoals opgeslagen in het register. Als er fouten optreden die worden veroorzaakt door ontbrekende typedefinities, controleert u de opmerkingen aan het hoofd van de . TLH om te zien welke afhankelijke typebibliotheken eerst moeten worden geïmporteerd. Waarschijnlijke fouten zijn syntaxisfouten (bijvoorbeeld C2143, C2146, C2321), C2501 (ontbrekende decl-specifiers) of C2433 ('inline' niet toegestaan voor gegevensdeclaratie) tijdens het compileren van de . TLI-bestand.
Als u afhankelijkheidsfouten wilt oplossen, bepaalt u welke afhankelijkheidsopmerkingen anders niet worden geleverd door systeemkoppen en geeft u op een bepaald moment een #import instructie op vóór de #import-instructie van de afhankelijke typebibliotheek.
#import kenmerken
#import kan eventueel een of meer kenmerken bevatten. Met deze kenmerken kan de compiler de inhoud van de typebibliotheekheaders wijzigen. Een backslash (\) symbool kan worden gebruikt om extra regels op te nemen in één #import instructie. Voorbeeld:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Zie #import kenmerken voor meer informatie.
END C++ specifieke