Директиву #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этот файл.)Препроцессор затем ищет вдоль путей, приведенных ниже. |
форма стенного угольника |
Указывает препроцессор для поиска файлов библиотеки типов в следующих путей:
|
Указав идентификатор и номер версии локализации
При указании идентификатор 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 директива также участвует в подобие уровень минимального перестроения и может быть размещена в предварительно скомпилированный файл заголовка.См. Создание предварительно скомпилированных файлов заголовков для получения дополнительных сведений.
Первичный файл заголовка библиотеки типов
Первичный файл заголовка библиотеки типов состоит из 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++