Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
específicos 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.
Sintaxe
#import "nome do arquivo" [atributos]
<#import> [atributos]
Parâmetros
nome do ficheiro
Especifica a biblioteca de tipos a ser importada. O nome do arquivo pode ser um dos seguintes tipos:
O nome de um arquivo que contém uma biblioteca de tipos, como um arquivo .olb, .tlb ou .dll. A palavra-chave,
file:, pode preceder 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 o ID de localização e o número da versão.
Quando você usa um compilador cruzado de 32 bits em um sistema operacional de 64 bits, o compilador só pode ler a seção do Registro de 32 bits. Talvez você queira usar o compilador nativo de 64 bits para criar e registrar uma biblioteca de tipos de 64 bits.
O ID da biblioteca da biblioteca de tipos. A palavra-chave,
libid:, pode preceder cada ID de biblioteca. Por exemplo:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")Se você não especificar
versionoulcid, as regras aplicadas tambémprogid:serão aplicadas aolibid:.Um ficheiro executável (.exe).
Um arquivo de biblioteca (.dll) contendo um recurso de biblioteca de tipos (como um .ocx).
Um documento composto que contém uma biblioteca de tipos.
Qualquer outro formato de arquivo que possa ser compreendido pela API LoadTypeLib .
atributos
Um ou mais atributos #import. Separe atributos com um espaço ou vírgula. Por exemplo:
#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
-ou-
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
Observações
Ordem de pesquisa para o nome do ficheiro
filename é opcionalmente precedido 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 em que o pré-processador procura os arquivos da biblioteca de tipos quando o caminho é especificado incompletamente.
| Forma de sintaxe | Ação |
|---|---|
| Formulário cotado | Instrui o pré-processador a procurar arquivos de biblioteca de tipos primeiro no diretório do arquivo que contém a instrução #import e, em seguida, nos diretórios de quaisquer arquivos que incluam (#include) esse arquivo. Em seguida, o pré-processador pesquisa ao longo dos caminhos mostrados abaixo. |
| Forma de colchete angular | Instrui o pré-processador a procurar arquivos de biblioteca de tipos nos seguintes caminhos: 1. A lista de caminhos de PATH variáveis de ambiente2. A lista de caminhos de LIB variáveis de ambiente3. O caminho especificado pela opção de compilador /I , exceto que o compilador está procurando por uma biblioteca de tipos que foi referenciada de outra biblioteca de tipos com o atributo no_registry . |
Especifique o ID de localização e o número da versão
Ao especificar um progid, você também pode especificar o ID de localização e o número da versão do progid. Por exemplo:
#import "progid:my.prog.id" lcid("0") version("4.0)
Se você não especificar um ID de localização, um progid será escolhido de acordo com as seguintes regras:
Se houver apenas um ID de localização, esse ID será usado.
Se houver mais de um ID de localização, o primeiro com o número de versão 0, 9 ou 409 será usado.
Se houver mais de um ID de localização e nenhum deles for 0, 9 ou 409, o último será usado.
Se você não especificar um número de versão, a versão mais recente será usada.
Arquivos de cabeçalho criados por importação
#import cria dois arquivos de cabeçalho que reconstroem o conteúdo da biblioteca de tipos no código-fonte C++. O arquivo de cabeçalho primário é semelhante ao produzido pelo compilador Microsoft Interface Definition Language (MIDL), mas com código e dados adicionais gerados pelo compilador. O arquivo de cabeçalho primário tem o mesmo nome base que a biblioteca de tipos, mais um arquivo . Extensão TLH. O arquivo de cabeçalho secundário tem o mesmo nome base que a biblioteca de tipos, com um arquivo . Extensão TLI. Ele contém as implementações para funções de membro geradas pelo compilador e está incluído (#include) no arquivo de cabeçalho primário.
Se importar uma propriedade dispinterface que usa byref parâmetros, #import não gerará uma instrução __declspec(property) para a função.
Ambos os arquivos de cabeçalho são colocados no diretório de saída especificado pela opção /Fo (name object file). Eles são então lidos e compilados pelo compilador como se o arquivo de cabeçalho primário fosse nomeado por uma #include diretiva.
As seguintes otimizações do compilador vêm com a diretiva #import :
O arquivo de cabeçalho, quando criado, recebe o mesmo carimbo de data/hora que a biblioteca de tipos.
Quando #import é processado, o compilador primeiro verifica se o cabeçalho existe e está up-to-date. Se sim, então ele não precisa ser recriado.
A diretiva #import também participa da reconstrução mínima e pode ser colocada em um arquivo de cabeçalho pré-compilado. Para obter mais informações, consulte Criando arquivos de cabeçalho pré-compilados.
Arquivo de cabeçalho da biblioteca de tipos primários
O arquivo de cabeçalho da biblioteca de tipos primários consiste em sete seções:
Título clichê: Consiste em comentários,
#includedeclaração para COMDEF. H (que define algumas macros padrão usadas no cabeçalho) e outras informações diversas de configuração.Forward references e typedefs: Consiste em declarações de estrutura como
struct IMyInterfacee typedefs.Declarações de ponteiro inteligente: A classe
_com_ptr_tde modelo é um ponteiro inteligente. Ele encapsula ponteiros de interface e elimina a necessidade de chamarAddRef,ReleaseeQueryInterfacefunções. Ele também oculta aCoCreateInstancechamada ao criar um novo objeto COM. Esta seção usa a instrução_COM_SMARTPTR_TYPEDEFmacro para estabelecer typedefs de interfaces COM como especializações de modelo da classe de modelo _com_ptr_t . Por exemplo, para a interfaceIMyInterface, o . O arquivo TLH conterá:_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));que o compilador expandirá para:
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;O tipo
IMyInterfacePtrpode então ser usado no lugar do ponteiroIMyInterface*de interface bruto. Consequentemente, não há necessidade de chamar as váriasIUnknownfunções de membroDeclarações Typeinfo: Consiste principalmente em definições de classe e outros itens que expõem os itens typeinfo individuais retornados pelo
ITypeLib::GetTypeInfo. Nesta seção, cada typeinfo da biblioteca de tipos é refletida no cabeçalho em um formulário dependente dasTYPEKINDinformações.Definição de GUID de estilo antigo opcional: contém inicializações das constantes GUID nomeadas. Estes nomes têm a forma
CLSID_CoClasseIID_Interface, semelhantes aos gerados pelo compilador MIDL.#includepara o cabeçalho secundário da biblioteca de tipos.Rodapé clichê: Atualmente inclui
#pragma pack(pop).
Todas as seções, exceto a seção clichê de cabeçalho e a seção clichê de rodapé, são incluídas em um namespace com seu nome especificado pela library instrução no arquivo IDL original. Você pode usar os nomes do cabeçalho da biblioteca de tipos por uma qualificação explícita usando o nome do namespace. Ou, você pode incluir a seguinte instrução:
using namespace MyLib;
imediatamente após a instrução #import no código-fonte.
O namespace pode ser suprimido usando o atributo no_namespace) da diretiva #import . No entanto, suprimir o namespace pode levar a colisões de nome. O namespace também pode ser renomeado pelo atributo rename_namespace .
O compilador fornece o caminho completo para qualquer dependência de biblioteca de tipos exigida pela biblioteca de tipos que está processando no momento. O caminho é gravado, na forma de comentários, no cabeçalho da biblioteca de tipos (. TLH) que o compilador gera para cada biblioteca de tipos processada.
Se uma biblioteca de tipos incluir referências a tipos definidos em outras bibliotecas de tipos, o . O arquivo TLH incluirá comentários do seguinte tipo:
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
O nome do arquivo real no comentário #import é o caminho completo da biblioteca de tipos de referência cruzada, conforme armazenado no registro. Se você encontrar erros causados por definições de tipo ausentes, verifique os comentários no cabeçalho do . TLH para ver quais bibliotecas de tipos dependentes podem precisar ser importadas primeiro. Os erros prováveis são erros de sintaxe (por exemplo, C2143, C2146, C2321), C2501 (especificadores decl ausentes) ou C2433 ('inline' não permitido na declaração de dados) durante a compilação do arquivo . Arquivo TLI.
Para resolver erros de dependência, determine quais dos comentários de dependência não são fornecidos pelos cabeçalhos do sistema e, em seguida, forneça uma diretiva #import em algum momento antes da diretiva #import da biblioteca de tipos dependentes.
#import atributos
#import pode opcionalmente incluir um ou mais atributos. Esses atributos dizem ao compilador para modificar o conteúdo dos cabeçalhos da biblioteca de tipos. Um símbolo de barra invertida (\) pode ser usado para incluir linhas adicionais em uma única instrução #import . Por exemplo:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Para obter mais informações, consulte #import atributos.
específicos do END C++