Поделиться через


Директиву #import (C++)

Конкретные C++

Используется для включения сведений из библиотеки типов.Содержимое библиотеки типов преобразовано в классы C++, в основном, описывающая интерфейс модели COM.

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

Параметры

  • filename
    Указывает библиотеку типов для импорта.filename может быть одно из следующих значений:

    • Имя файла, содержащего библиотеку типов, например .olb, .tlb или dll-файла.Ключевое слово **файл:**может предшествовать имя каждого файла.

    • Идентификатор progid элемента управления в библиотеке типов.Ключевое слово **идентификатор progid:**может предшествовать каждый идентификатор progid.Примеры.

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

      Дополнительные сведения о см. идентификаторы progid. Указав идентификатор и номер версии локализации.

      Обратите внимание, что при компилировании с пакетом обновления 64 (sp2 кросскомпилятором в операционной системе, компилятор будет считывать только 32 куст реестра.Можно использовать собственный 64 компилятора для построения и зарегистрировать 64 библиотеку типов.

    • Идентификатор библиотеки библиотеки типов.Ключевое слово **libid:**может предшествовать каждый идентификатор библиотекиПримеры.

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

      Если не указать версию или lcid, правила это применяется к идентификатор progid: также применяются к libid:.

    • Исполняемый файл (exe).

    • Файл библиотеки (.dll), содержащий ресурс библиотеки типов (например, .ocx).

    • Составной документ, содержащий библиотеку типов.

    • Любой другой формат файла, который может быть понят LoadTypeLib API.

  • attributes
    Один или несколько атрибуты #import.Используйте в качестве разделителя атрибутов пробел или запятую.Примеры.

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

    -или-

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

Заметки

Порядок поиска для имени файла

fileName при необходимости предшествует спецификацией каталога.Имя файла должно иметь имя существующего файла.Разница между 2 форм синтаксиса порядок, в котором препроцессор выполняет поиск файлов библиотеки типов, когда путь неполные определен.

Форма синтаксиса

Действие

закавыченная форма

Указывает препроцессор для поиска файлов библиотеки типов в каталоге файла, содержащего #import выписка, а затем в каталогах любых файлов, которые включают (#includeэтот файл.)Препроцессор затем ищет вдоль путей, приведенных ниже.

форма стенного угольника

Указывает препроцессор для поиска файлов библиотеки типов в следующих путей:

  1. Путь список путей в переменной среды

  2. LIB список путей в переменной среды

  3. Путь, указанный параметром компилятора /I (дополнительные каталоги включения), за исключением его компилятор выполняет поиск библиотеки типов, на которую указывает ссылка из другой библиотеки типов с no_registry атрибут.

Указав идентификатор и номер версии локализации

При указании идентификатор progid, можно также указать идентификатор локализации и номер версии идентификатор progid.Примеры.

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

Если не указать идентификатор локализации, то идентификатор progid выбрано по следующим правилам.

  • Если существует только одно идентификатор локализации, то он используется.

  • Если несколько идентификатор локализации, используется первое с номером версии 0, 9 или 409.

  • Если больше, чем один идентификатор локализации и ни одна из них 0, 9 или 409, последнее он используется.

  • Если не указать номер версии, самую последнюю версию.

Файлы заголовков, созданные ввозом

#import создает 2 файла заголовка, который реконструируют содержимого библиотеки типов в исходном коде C++.Первичный файл заголовка похож на файл заголовка генерируемый компилятором MIDL Майкрософт (IDL), но с дополнительными компилятор-произведенными кодом и данными.первичный файл заголовка имеет одинаковое базовое имя, что и библиотека типов, а также расширение .TLH.Вторичный файл заголовка имеет одинаковое базовое имя, что и библиотека типов с расширением .TLI.Он содержит реализацию для функций-членов, созданных компилятором и включен (#include) в первичном файле заголовка.

Если импортирование свойство диспетчерский интерфейс, используются параметры byref #import не будет формировать __declspec (свойствовыписка) для функции.

Оба файла заголовков помещаются в выходном каталоге, заданном параметром /Fo (имя файла объекта).Затем они считываются и компилировать компилятором если первичный файл заголовка назывался a #include директива.

Следующие оптимизации компилятора поставляемых с #import директива:

  • Файл заголовка, создается, то та же отметку времени в библиотеке типов.

  • После #import обрабатывает компилятора сначала проверяет, если заголовок существует и актуален.Если да, затем для этого не должно быть создано повторно.

#import директива также участвует в подобие уровень минимального перестроения и может быть размещена в предварительно скомпилированный файл заголовка.См. Создание предварительно скомпилированных файлов заголовков для получения дополнительных сведений.

8etzzkb6.collapse_all(ru-ru,VS.110).gifПервичный файл заголовка библиотеки типов

Первичный файл заголовка библиотеки типов состоит из 7 частей:

  • Котельный лист заголовка. состоит из комментариев, #include для COMDEF.H (выписка, определяющее некоторые стандартные макросы, используемые в заголовке) и другие различные сведения об установке.

  • Front ссылки и определения типов: Состоит из объявлений в макете struct IMyInterface и определения типов.

  • Интеллектуальные объявления указателя. Класс-шаблон _com_ptr_t реализация умн-указателя, которая инкапсулирует указатели интерфейса и исключает необходимость вызова AddRef" Выпуск" QueryInterface функции.Кроме того, он скрывает CoCreateInstance вызов в создания нового COM-объект.Этот раздел используется выписку макроса _COM_SMARTPTR_TYPEDEF установить определения типов интерфейсов модели COM, чтобы быть специализациями шаблона _com_ptr_t класс шаблона.Например, для интерфейса IMyInterfaceфайл .TLH будет содержать:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    чтобы компилятор развернуть:

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

    Тип IMyInterfacePtr может затем использоваться вместо начального указателя интерфейса IMyInterface*.Таким образом, нет необходимости вызывать различные IUnknown функции элементов

  • Объявления Typeinfo: В основном состоит из определений классов и других элементов, предоставляющими отдельные элементы typeinfo возвращаемые by ITypeLib: GetTypeInfo.В этом разделе, каждое typeinfo из библиотеки типов отражаются в заголовке формы в зависимой ячейке TYPEKIND информация.

  • Необязательное определение предыдущего GUID: Содержит инициализации именованных констант GUID.Эти имена формы CLSID_CoClass и IID_Interfaceаналогичным образом, к этим созданным компилятором MIDL.

  • #include выписка для получателя заголовка библиотеки типов.

  • Котельный лист нижнего колонтитула: в настоящее время включает #pragma pack(pop).

Все инструкции, за исключением раздела котельного листа заголовка и котельного листа нижнего колонтитула, заключенные в пространство имен при его имя, указанное Библиотека выписка в исходном файле IDL.Можно использовать имена из заголовков библиотек типов или явной квалификацией с именем пространства имен или формулировку, включая следующие:

using namespace MyLib;

сразу после #import выписка в исходном коде.

Пространство имен может быть отключено, используя no_namespace атрибут #import директива.Однако подавление пространство имен может привести для именования конфликтов.Пространство имен может быть переименовано rename_namespace атрибут.

Компилятор предоставляет полный путь к библиотеке типов, любая зависимость является библиотекой типов его в настоящий момент.Путь записывается в форме комментариев, в заголовке библиотеки типов (.TLH), компилятор создает для каждой обрабатываемой библиотеки типов.

Если библиотека типов содержит ссылки на определенные типы в других библиотеках типов, файл .TLH включает комментарии следующей сортировки:

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

Фактическое имя файла #import комментарий полный путь крест-снабженной на библиотеки типов, например сохранены в реестре.При возникновении ошибки, которые должны к отсутствующим определениям типов, проверьте комментарии в начало .TLH, чтобы определить, какие зависимые библиотеки типов могут быть импортирована в первую очередь.Вероятностью ошибок синтаксические ошибки C2146 (например, C2143, C2321), C2501 (потоковые рассекречивани-описатели) или C2433 (" встроенный" не разрешенный в объявлении данных) во время компилирующ файл .TLI.

Необходимо определить, какие из комментариев зависимости в противном случае не предоставлен для заголовков системы и затем предоставлять #import директива в некоторый момент перед #import директива зависимой библиотеки типов для разрешения ошибки.

Дополнительные сведения см. в статье базы знаний "методы программы-оболочки #import может вызвать Нарушение доступа" (Q242527) или "ошибка компилятора при использовании #import с XML" (Q269194).Статьи базы знаний можно найти в библиотеке MSDN или на носителе https://support.microsoft.com/support/.

Атрибуты #import

#import может также включать один или несколько атрибутов.Эти атрибуты говорят, что компилятор изменяет содержимое заголовка библиотеки типов.Обратная косая черта " (\) символ можно использовать, чтобы включить дополнительные линии в одном #import выписка.Примеры.

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

Дополнительные сведения см. в разделе атрибуты #import (C++).

ЭЛЕМЕНТ, относящийся C++

См. также

Ссылки

Директивы препроцессора

Поддержка модели COM в компиляторе