Compartilhar via


# Import diretiva (C++)

Específico do C++

Usado para incorporar informações de uma biblioteca de tipos.O conteúdo da biblioteca de tipos é convertido em classes C++, principalmente, descrevendo as interfaces COM.

#import "filename" [attributes]
#import <filename> [attributes]

Parâmetros

  • nome do arquivo
    Especifica a biblioteca de tipos para importar.filenamepode ser uma das seguintes opções:

    • O nome de um arquivo que contém uma biblioteca de tipos, como, por exemplo, um arquivo. dll,. tlb ou. olb.A palavra-chave, arquivo:, pode preceder a cada nome de arquivo.

    • O progid de um controle na biblioteca de tipos.A palavra-chave, progid:, pode preceder cada progid.Por exemplo:

      #import "progid:my.prog.id.1.5"
      

      Para obter mais informações sobre progids, consulte especificando a identificação de localização e o número da versão.

      Observe que, durante a compilação com um compilador cruzado em um sistema operacional de 64 bits, o compilador será capaz de ler apenas a seção de registro de 32 bits.Você talvez queira usar o compilador de 64 bits nativo para criar e registrar uma biblioteca de tipos de 64 bits.

    • A identificação da biblioteca do tipo de biblioteca.A palavra-chave, ID da biblioteca:, pode preceder a cada identificação de biblioteca.Por exemplo:

      #import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
      

      Se você não especificar versão ou lcid, o regras que são aplicadas a progid: também são aplicadas a ID da biblioteca:.

    • Um arquivo executável (. exe).

    • Um arquivo. dll (biblioteca) que contém um recurso de biblioteca de tipo (por exemplo,. ocx).

    • Um documento composto que contém uma biblioteca de tipos.

    • Qualquer outro formato de arquivo que pode ser entendido pelo LoadTypeLib API.

  • attributes
    Um ou mais # Import atributos.Atributos separados com um espaço ou uma vírgula.Por exemplo:

    #import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
    

    - ou -

    #import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
    

Comentários

Ordem de pesquisa de nome de arquivo

nome do arquivo , é precedida por uma especificação de diretório.O nome do arquivo deve nomear um arquivo existente.A diferença entre as duas formas de sintaxe é a ordem na qual o pré-processador procura por arquivos de biblioteca de tipo quando o caminho é especificado de forma incompleta.

Formulário de sintaxe

Ação

Formulário entre aspas

Instrui o pré-processador para procurar por arquivos de biblioteca de tipo primeiramente no diretório do arquivo que contém o #import instrução e, em seguida, nos diretórios de quaisquer arquivos que incluem (#include) desse arquivo.O pré-processador pesquisará caminhos mostrados abaixo.

Formulário colchete angular

Instrui o pré-processador para procurar arquivos de biblioteca de tipo ao longo dos seguintes caminhos:

  1. O caminho lista caminho da variável de ambiente

  2. O LIB lista caminho da variável de ambiente

  3. O caminho especificado pela opção /I (adicionais diretórios de inclusão) a opção de compilador, exceto o compilador está procurando por uma biblioteca de tipos referenciada de outra biblioteca de tipos com o no_registry atributo.

Especificando a identificação de localização e o número de versão

Quando você especifica um progid, você também pode especificar o número de ID e a versão de localização de identificação do programa.Por exemplo:

#import "progid:my.prog.id" lcid("0") version("4.0)

Se você não especificar uma identificação de localização, um progid é escolhido de acordo com as seguintes regras:

  • Se houver apenas uma identificação de localização, que será usado.

  • Se houver mais de uma identificação de localização, a primeira com número de versão 0, 9 ou 409 é usada.

  • Se houver mais de uma identificação de localização e nenhuma delas é 0, 9 ou 409, a última é usada.

  • Se você não especificar um número de versão, a versão mais recente é usada.

Criado pela importação de arquivos de cabeçalho

#importcria dois arquivos de cabeçalho que reconstruir o conteúdo da biblioteca de tipo no código fonte C++.O arquivo de cabeçalho principal é semelhante ao produzido pelo compilador de linguagem de definição de Interface da Microsoft (MIDL), mas com dados e o código gerado pelo compilador de adicional.O o arquivo de cabeçalho principal tem o mesmo nome de base como a biblioteca de tipos, além de um.Extensão TLH.O arquivo de cabeçalho secundário tem o mesmo nome de base como a biblioteca de tipos, com um.Extensão TLI.Ela contém as implementações para funções de membro gerado pelo compilador e está incluída (#include) no arquivo de cabeçalho principal.

Se importar uma propriedade dispinterface que usa parâmetros byref, # Import não irá gerar __declspec (propriedade) a declaração da função.

Ambos os arquivos de cabeçalho são colocados no diretório de saída especificado pela opção /Fo (arquivo de nome de objeto).Eles são lidos e compilados pelo compilador, como se o arquivo de cabeçalho principal foi chamado por um #include diretiva.

As seguintes otimizações do compilador são fornecidos com o #import diretiva:

  • O arquivo de cabeçalho, quando criado, recebe o carimbo de hora mesmo como a biblioteca de tipos.

  • Quando #import é processada, o compilador verifica primeiro se o cabeçalho existe e está atualizado.Em caso afirmativo, ele não precisa ser recriada.

O #import diretiva também participa de recompilação mínima e pode ser colocada em um arquivo de cabeçalho pré-compilado.Consulte Criação de arquivos de cabeçalho pré-compilado para obter mais informações.

8etzzkb6.collapse_all(pt-br,VS.110).gifArquivo de cabeçalho de biblioteca de tipo primário

O arquivo de cabeçalho da biblioteca de tipo primário consiste em sete seções:

  • Título clichê: é constituída de comentários, #include instrução para COMDEF.H (que define algumas macros padrão usadas no cabeçalho) e outras informações de instalação de diversos.

  • Encaminhar referências e definições de tipo: consiste em declarações de estrutura, como struct IMyInterface e definições de tipo.

  • Inteligente de declarações do ponteiro: A classe de modelo _com_ptr_t é uma implementação de ponteiro inteligente que encapsula os ponteiros de interface e elimina a necessidade de chamar AddRef, Release, QueryInterface funções.Além disso, ele oculta a CoCreateInstance chamar na criação de um novo objeto COM.Esta seção usa a instrução de macro _COM_SMARTPTR_TYPEDEF para estabelecer as definições de tipo de interfaces COM para ser especializações do modelo da _ com_ptr_t classe de modelo.Por exemplo, para a interface IMyInterface, o.Arquivo TLH conterá:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    qual o compilador se expandirá para:

    typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
    

    Tipo de IMyInterfacePtr pode ser usado no lugar do ponteiro de interface raw IMyInterface*.Conseqüentemente, não há nenhuma necessidade de chamar as várias IUnknown funções de membro

  • Declarações de TypeInfo: consiste principalmente de definições de classe e outros itens, expondo os itens individuais typeinfo retornados por ITypeLib:GetTypeInfo.Nesta seção, cada typeinfo de biblioteca de tipos é refletido no cabeçalho de um formulário depende do TYPEKIND informações.

  • Definição de GUID de estilo antigo opcional: contém inicializações as constantes nomeadas de GUID.Esses são os nomes do formulário CLSID_CoClass e IID_Interface, semelhantes aos gerado pelo compilador MIDL.

  • #includeinstrução para o cabeçalho da biblioteca de tipo secundário.

  • Clichê do rodapé: no momento inclui #pragma pack(pop).

Todas as seções, exceto a seção de clichê título clichê e rodapé, são colocadas em um namespace com o nome especificado pelo biblioteca declaração no arquivo IDL original.Você pode usar os nomes do cabeçalho da biblioteca tipo por uma qualificação explícita com o nome do namespace ou incluindo a instrução a seguir:

using namespace MyLib;

imediatamente após a #import a instrução no código fonte.

O espaço para nome pode ser eliminado, usando o no_namespace atributo da #import diretiva.No entanto, a supressão do namespace pode levar a conflitos de nome.O namespace também pode ser renomeado com o rename_namespace atributo.

O compilador fornece o caminho completo para qualquer dependência da biblioteca de tipo necessário para a biblioteca de tipos está processando no momento.O caminho é escrito na forma de comentários, no cabeçalho do tipo de biblioteca (.TLH) que o compilador gera para cada biblioteca de tipos processados.

Se uma biblioteca de tipos inclui referências aos tipos definidos em outras bibliotecas de tipo, em seguida, a.Arquivo TLH incluirá os comentários da seguinte classificação:

//
// Cross-referenced type libraries:
//
//  #import "c:\path\typelib0.tlb"
//

O nome do arquivo real na #import comentário é o caminho completo da biblioteca tipo com referência cruzada, conforme armazenada no registro.Se você encontrar erros que ocorrem devido à falta de definições de tipo, verifique os comentários no topo da.TLH para ver quais bibliotecas de tipos dependentes talvez precise ser importados pela primeira vez.Erros de prováveis são erros de sintaxe (por exemplo, C2143, C2146, C2321), C2501 (ausente especificadores de decl), ou C2433 ('inline' não é permitido em declarações de dados) ao compilar o.Arquivo TLI.

Você deve determinar qual da dependência, comentários não são caso contrário fornecidos para por cabeçalhos do sistema e fornecem um #import diretiva em algum momento antes do #import diretriz da biblioteca de tipos dependentes para resolver os erros.

Para obter mais informações, consulte o artigo da Base de Conhecimento "# Import métodos de invólucro que pode causar violação de acesso" (Q242527) ou "erros do compilador quando você usa o # Import com XML" (Q269194).Você pode encontrar artigos do Knowledge Base na mídia de Biblioteca MSDN ou em https://support.microsoft.com/support/.

atributos de # import

#importopcionalmente pode incluir um ou mais atributos.Esses atributos informam o compilador para modificar o conteúdo dos cabeçalhos de biblioteca de tipos.Uma barra invertida (\) símbolo pode ser usado para incluir linhas adicionais em um único #import instrução.Por exemplo:

#import "test.lib" no_namespace \
   rename("OldName", "NewName")

Para obter mais informações, consulte # Import atributos (C++).

FINAL específico do C++

Consulte também

Referência

Diretivas de pré-processador

Compilador COM suporte