include pch h что это
Урок №5. Компиляция вашей первой программы
Перед написанием нашей первой программы мы еще должны кое-что узнать.
Теория
Во-вторых, есть разные типы проектов. При создании нового проекта, вам нужно будет выбрать его тип. Все проекты, которые мы будем создавать на данных уроках, будут консольного типа. Это означает, что они запускаются в консоли (аналог командной строки). По умолчанию, консольные приложения не имеют графического интерфейса пользователя — GUI (сокр. от «Graphical User Interface») и компилируются в автономные исполняемые файлы. Это идеальный вариант для изучения языка C++, так как он сводит всю сложность к минимуму.
В-третьих, при создании нового проекта большинство IDE автоматически добавят ваш проект в рабочее пространство. Рабочее пространство — это своеобразный контейнер, который может содержать один или несколько связанных проектов. Несмотря на то, что вы можете добавить несколько проектов в одно рабочее пространство, все же рекомендуется создавать отдельное рабочее пространство для каждой программы. Это намного упрощает работу для новичков.
Традиционно, первой программой на новом языке программирования является всеми известная программа «Hello, world!». Мы не будем нарушать традиции 🙂
Пользователям Visual Studio
Для создания нового проекта в Visual Studio 2019, вам нужно сначала запустить эту IDE, затем выбрать «Файл» > «Создать» > «Проект» :
Дальше появится диалоговое окно, где вам нужно будет выбрать «Консольное приложение Windows» из вкладки «Visual C++» и нажать «ОК» :
Также вы можете указать имя проекта (любое) и его расположение (рекомендую ничего не менять) в соответствующих полях.
В текстовом редакторе вы увидите, что уже есть некоторый текст и код — удалите его, а затем напечатайте или скопируйте следующий код:
Файлы предварительно скомпилированных заголовков
Параметры компилятора для предкомпилированных заголовков — /Y. На страницах свойств проекта параметры находятся в разделе Свойства конфигурации > Предкомпилированные заголовки C/C++. Можно не использовать предкомпилированные заголовки, а также указать имя файла заголовка и путь к выходному файлу.
Настраиваемый предварительно скомпилированный код
Для больших проектов, для которых требуется значительное время, может потребоваться создать настраиваемые предварительно скомпилированные файлы. Компиляторы Microsoft C и C++ содержат параметры для предварительной компиляции любого кода C или C++, включая встроенный код. Данная возможность позволяет скомпилировать стабильное тело кода, сохранять скомпилированное состояние кода в файле, а при последующих компиляциях объединять предварительно скомпилированный код с кодом, который еще находится в стадии разработки. Каждая последующая компиляция выполняется быстрее, так как стабильный код не нужно компилировать повторно.
Случаи использования предварительной компиляции исходного кода
Предварительно скомпилированный код полезен во время цикла разработки, чтобы сократить время компиляции, особенно если:
Всегда используется большой текст кода, в который редко вносятся изменения.
Программа состоит из нескольких модулей, каждый из которых использует стандартный набор включаемых файлов, а также одни и те же параметры компиляции. В этом случае все включаемые файлы можно предварительно скомпилировать в один предкомпилированный заголовок.
Первая компиляция, которая создает файл предкомпилированного заголовка (PCH), занимает немного больше времени, чем последующие компиляции. Последующие компиляции могут выполняться быстрее, включая предварительно скомпилированный код.
Можно предварительно скомпилировать программы C и C++. В программировании на языке C++ распространенной практикой является отделение сведений об интерфейсе класса в файлы заголовков. Впоследствии эти файлы заголовков можно будет включать в программы, использующие класс. Предварительная компиляция этих заголовков позволяет сократить время, затрачиваемое программой на компиляцию.
Хотя для каждого исходного файла можно использовать только один файл предкомпилированного заголовка (PCH), в проекте можно использовать несколько файлов PCH.
Два варианта предварительной компиляции кода
Можно предварительно скомпилировать любой код C или C++ — вы не ограничены предварительной компиляцией только файлов заголовков.
Для предварительной компиляции требуется планирование, но при предварительной компиляции исходного кода, отличного от простых файлов заголовков, обеспечивается значительно более быстрая компиляция.
Предварительная компиляция кода рекомендуется, когда известно, что исходные файлы используют общие наборы файлов заголовков, но не содержат их в том же порядке, или если требуется включить исходный код в предварительную компиляцию.
Параметры предкомпилированного заголовка см. в разделах /Yc (создание файла предкомпилированного заголовка) и /Yu (использование файла предкомпилированного заголовка). Для создания предкомпилированного заголовка используйте /Yc. При использовании с необязательной прагмой hdrstop параметр /Yc позволяет предварительно компилировать как файлы заголовков, так и исходный код. Выберите /Yu, чтобы использовать существующий предкомпилированный заголовок в существующей компиляции. Можно также использовать /Fp с параметрами /Yc и /Yu, чтобы предоставить альтернативное имя предкомпилированному заголовку.
В справочных разделах, посвященных параметрам компилятора /Yu и /Yc, обсуждаются способы доступа к этой функции в среде разработки.
Правила согласованности предкомпилированных заголовков
Поскольку файлы PCH содержат сведения о среде компьютера, а также сведения об адресах памяти для программы, файл PCH следует использовать только на том компьютере, на котором он был создан.
Правила целостности для пофайлового использования предкомпилированных заголовков
Параметр компилятора /Yu позволяет указать, какой файл PCH следует использовать.
При использовании файла PCH компилятор предполагает ту же среду компиляции, которая использует последовательные параметры компилятора, прагмы и т. д., которые действуют при создании файла PCH, если не указано иное. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. Требования к согласованности для файлов PCH описаны в следующих разделах.
Согласованность параметров компилятора
Следующие параметры компилятора могут вызвать предупреждение о несогласованности при использовании файла PCH:
Макросы, созданные с помощью параметра препроцессора (/D), должны быть одинаковыми в компиляциях, создавшими файл PCH, и текущей компиляцией. Состояние определенных констант не проверяется, но при их изменениях могут возникать непредсказуемые результаты.
Файлы PCH не работают с параметрами/E и /EP.
Файлы PCH должны быть созданы с помощью параметра создания сведений о просмотре (/FR) или исключения локальных переменных (/Fr), прежде чем последующие компиляции, использующие файл PCH, смогут использовать эти параметры.
C7 совместимо (/Z7)
Если при создании файла PCH этот параметр включен, последующие компиляции, использующие файл PCH, могут использовать отладочную информацию.
Если при создании файла PCH параметр «C7 совместимо (/Z7)» отключен, последующие компиляции, использующие файл PCH и/Z7, вызывают предупреждение. Отладочная информация помещается в текущий OBJ-файл, а локальные символы, определенные в файле PCH, недоступны отладчику.
Согласованность пути включаемых файлов
В файле PCH не содержатся сведения о пути включаемых файлов, который применялся при создании. При использовании файла PCH компилятор всегда использует путь включаемых файлов, указанный в текущей компиляции.
Согласованность исходного файла
При указании параметра использования файла предкомпилированного заголовка (/Yu) компилятор игнорирует все директивы препроцессора (включая прагмы), отображаемые в исходном коде, который будет предварительно скомпилирован. Компиляция, указанная такими директивами препроцессора, должна совпадать с компиляцией, используемой для параметра создания файла предкомпилированного заголовка (/Yc).
Согласованность прагмы
Прагмы, обработанные во время создания файла PCH, обычно влияют на файл, с которым впоследствии используется файл PCH. Прагмы comment и message не влияют на оставшуюся часть компиляции.
Они влияют только на код в файле PCH; они не влияют на код, который впоследствии использует файл PCH:
Эти прагмы сохраняются как часть предкомпилированного заголовка и влияют на оставшуюся часть компиляции, использующую предкомпилированный заголовок:
alloc_text
auto_inline
check_stack
code_seg
data_seg
function
include_alias
init_seg
inline_depth
inline_recursion
intrinsic
optimize
pack
pointers_to_members
setlocale
vtordisp
warning
Правила целостности для параметров компилятора /Yc и /Yu
При использовании предкомпилированного заголовка, созданного с помощью параметра /Yc или/Yu, компилятор сравнивает текущую среду компиляции с той, которая существовала при создании файла PCH. Не забудьте указать среду, соответствующую предыдущей (с помощью параметров компилятора, прагм и т. д.) для текущей компиляции. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. В следующих разделах объясняются требования к согласованности для предкомпилированных заголовков.
Согласованность параметров компилятора
В таблице ниже перечислены параметры компилятора, которые могут вызвать предупреждение о несогласованности при использовании предкомпилированного заголовка.
Параметр | name | Правило |
---|---|---|
/D | Определение констант и макросов | Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Состояние определенных констант не проверяется, но если файлы зависят от значений измененных констант, могут возникать непредсказуемые результаты. |
/E или /EP | Копирование выходных данных препроцессора в стандартный вывод | Предкомпилированные заголовки не работают с параметром /E или /EP. |
/FR или /FR | Создание сведений о браузере исходного кода Майкрософт | Чтобы параметры /Fr и /FR были допустимыми вместе с параметром /Yu, они также должны применяться при создании предкомпилированного заголовка. При последующих компиляциях, использующих предкомпилированный заголовок, также создаются сведения о браузере исходного кода. Сведения о браузере помещаются в один SBR-файл, и на него ссылаются другие файлы так же, как и сведения CodeView. Нельзя переопределить размещение сведений о браузере исходного кода. |
/GA, /GD, /GE, /Gw или /GW | Параметры протокола Windows | Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Если эти параметры различаются, выдается предупреждение. |
/ZI | Создание полной отладочной информации | Если при создании предкомпилированного заголовка этот параметр включен, последующие компиляции, использующие предварительную компиляцию, могут использовать отладочную информацию. Если при создании предкомпилированного заголовка параметр /Zi не был включен, последующие компиляции, использующие предварительную компиляцию и параметр /Zi, выдают предупреждение. Отладочная информация помещается в текущий OBJ-файл, а локальные символы, определенные в предкомпилированном заголовке, недоступны отладчику. |
Средство предварительно откомпилированных заголовков предназначено для использования только в исходных файлах C и C++.
Использование предкомпилированных заголовков в проекте
В предыдущих разделах представлен обзор предкомпилированных заголовков: /Yc и /Yu, параметра /FP и прагмы hdrstop. В этом разделе описывается метод использования в проекте параметров заголовков, предкомпилированных вручную. В конце раздела приводится пример файла makefile и кода, который управляет им.
Чтобы ознакомиться с другим подходом к использованию в проекте параметров заголовков, предкомпилированных вручную, изучите один из файлов makefile, расположенных в каталоге MFC\SRC, который создается во время установки Visual Studio по умолчанию. Подход в этих файлах makefile аналогичен представленному в этом разделе, однако в них используются макросы служебной программы обслуживания Майкрософт (NMAKE) и обеспечивается больший контроль над процессом сборки.
PCH-файлы в процессе построения
База кода проекта программного обеспечения обычно содержится в нескольких исходных файлах C или C++, объектных файлах, библиотеках и файлах заголовков. Как правило, файл makefile координирует объединение этих элементов в исполняемый файл. На следующем рисунке показана структура файла makefile, использующего файл предкомпилированного заголовка. Имена макросов и имена файлов на рисунке соответствуют приведенным в примере кода в разделах Пример файла makefile для PCH и Пример кода для PCH.
На рисунке для отображения последовательности процесса сборки используются три схематических элемента. Прямоугольники представляют каждый файл или макрос; три макроса представляют один или несколько файлов. Затененные области представляют каждое действие компиляции или компоновки. Стрелки показывают, какие файлы и макросы объединяются во время процесса компиляции или компоновки.
Структура файла makefile, использующего файл предкомпилированного заголовка
Начиная с верхней части диаграммы, STABLEHDRS и BOUNDRY являются макросами NMAKE, в которых вы перечислите файлы, которые, скорее всего, не потребуют перекомпиляции. Эти файлы компилируются с помощью командной строки
CL /c /W3 /Yc$(BOUNDRY) applib.cpp myapp.cpp
только если файл предкомпилированного заголовка (STABLE.pch) не существует или если вы вносите изменения в файлы, перечисленные в двух макросах. В любом случае файл предкомпилированного заголовка будет содержать код только из файлов, перечисленных в макросе STABLEHDRS. Перечислите последний файл, который необходимо предварительно откомпилировать в макросе BOUNDRY.
Файлы, перечисленные в этих макросах, могут быть файлами заголовков или файлами исходного кода C или C++. (Один PCH-файл нельзя использовать одновременно с модулями C и C++.) Обратите внимание, что можно использовать макрос hdrstop для отмены предварительной компиляции в какой бы то ни было момент в файле. Дополнительные сведения см. в разделе hdrstop.
Далее APPLIB.obj на схеме представляет код поддержки, используемый в окончательном приложении. Он создается из APPLIB.cpp, файлов, перечисленных в макросе UNSTABLEHDRS, и предварительно скомпилированного кода из предкомпилированного заголовка.
MYAPP.obj представляет конечное приложение. Он создается из файла MYAPP.cpp, файлов, перечисленных в макросе UNSTABLEHDRS, и предварительно скомпилированного кода из предкомпилированного заголовка.
Наконец, создается исполняемый файл (MYAPP.EXE) путем связывания файлов, перечисленных в макросе OBJS (APPLIB.obj и MYAPP.obj).
Образец файла makefile для PCH
Помимо макросов STABLEHDRS, BOUNDRY и UNSTABLEHDRS, показанных на рисунке «Структура файла makefile, использующего файл предкомпилированного заголовка» в разделе PCH-файлы в процессе сборки, этот файл makefile предоставляет макрос CLFLAGS и макрос LINKFLAGS. Эти макросы необходимо использовать для перечисления параметров компилятора и компоновщика, которые применяются при сборке отладочной или финальной версии исполняемого файла приложения. Также имеется макрос LIBS, в котором перечислены библиотеки, необходимые для проекта.
Эта функция позволяет использовать один и тот же файл makefile во время разработки и для финальных версий программы — используйте DEBUG=0 для финальных версий. Следующие строки команды являются эквивалентными.
Дополнительные сведения о файлах makefile см. в разделе Справочник по NMAKE. См. также разделы Параметры компилятора MSVC и Параметры компоновщика MSVC.
Пример кода для PCH
Следующие исходные файлы используются в файле makefile, который описан в разделах PCH-файлы в процессе сборки и Образец файла makefile для PCH. Обратите внимание, что комментарии содержат важную информацию.
Что такое «pch.h» и почему его нужно включить в качестве первого заголовочного файла?
Что такое «pch.h»? Почему он должен быть включен в качестве первого заголовочного файла?
1 ответ
Я знаю, что в C#. нет концепции заголовочных файлов, я создал заголовочный файл с некоторыми определениями и структурами для проекта c++. Теперь мне нужно разработать тот же проект, используя C#, в C#, как мы можем объявить содержимое этого заголовочного файла. Мне нужно использовать это.
В компьютерном программировании предварительно скомпилированный заголовок-это файл заголовка (C или C++), который компилируется в промежуточную форму, которая быстрее обрабатывается компилятором. Использование предварительно скомпилированных заголовков может значительно сократить время компиляции, особенно при применении к большим файлам заголовков, файлам заголовков, включающим множество других файлов заголовков, или файлам заголовков, включенным во многие единицы перевода.
В Visual Studio предварительно скомпилированный заголовок обычно называется «pch.h» (для консольных приложений), но можно использовать другое имя или не использовать его вообще. Какой файл будет предварительно скомпилированным заголовком, если таковой имеется, определяется настройками проектов.
Похожие вопросы:
Я создал библиотеку функций, из которой хочу создать DLL и создать библиотеку экспорта. Создание DLL-это не проблема. Проблема в том, что я не хочу, чтобы разработчик/пользователь заглядывал внутрь.
Зачем объявлять класс, который вы включили в качестве заголовочного файла? #include TreeCallObj.h #include TreeDevObj.h #include TreeDevCallObj.h class TreeCallObj; //what is the purpose of this.
Мне нужно разобрать заголовочный файл. Моя цель-найти конкретную структуру из заголовочного файла и извлечь значения и смещения структурных переменных. Может ли кто-нибудь предложить лучший способ.
Я знаю, что в C#. нет концепции заголовочных файлов, я создал заголовочный файл с некоторыми определениями и структурами для проекта c++. Теперь мне нужно разработать тот же проект, используя C#, в.
У меня есть вопрос, касающийся злоупотребления препроцессором C, с этим конкретным примером, относящимся к gcc в системе Linux (если это имеет значение). Я хочу сделать что-то вроде следующего: char.
Я работаю в процессе удаления связки кода C, который использовал переменные, объявленные в заголовочном файле. Мой компилятор по какой-либо причине не предупреждает о неиспользуемой переменной из.
Я использовал функцию strlen() из библиотеки string.h, не включая заголовок, который я хочу включить из файла заголовка, который изначально реализован, потому что я пишу свою собственную реализацию.
Итак, я пытался изучить cpp, и я писал программу, и когда я пытаюсь построить решение, оно выдает ошибку, говоря: неожиданный конец файла при поиске предварительно скомпилированного заголовка. Вы.
Что такое «pch.h» и почему его нужно включить в качестве первого заголовочного файла?
Что такое «pch.h»? Почему он должен быть включен в качестве первого заголовочного файла?
1 ответ
Я знаю, что в C#. нет концепции заголовочных файлов, я создал заголовочный файл с некоторыми определениями и структурами для проекта c++. Теперь мне нужно разработать тот же проект, используя C#, в C#, как мы можем объявить содержимое этого заголовочного файла. Мне нужно использовать это.
В компьютерном программировании предварительно скомпилированный заголовок-это файл заголовка (C или C++), который компилируется в промежуточную форму, которая быстрее обрабатывается компилятором. Использование предварительно скомпилированных заголовков может значительно сократить время компиляции, особенно при применении к большим файлам заголовков, файлам заголовков, включающим множество других файлов заголовков, или файлам заголовков, включенным во многие единицы перевода.
В Visual Studio предварительно скомпилированный заголовок обычно называется «pch.h» (для консольных приложений), но можно использовать другое имя или не использовать его вообще. Какой файл будет предварительно скомпилированным заголовком, если таковой имеется, определяется настройками проектов.
Похожие вопросы:
Я создал библиотеку функций, из которой хочу создать DLL и создать библиотеку экспорта. Создание DLL-это не проблема. Проблема в том, что я не хочу, чтобы разработчик/пользователь заглядывал внутрь.
Зачем объявлять класс, который вы включили в качестве заголовочного файла? #include TreeCallObj.h #include TreeDevObj.h #include TreeDevCallObj.h class TreeCallObj; //what is the purpose of this.
Мне нужно разобрать заголовочный файл. Моя цель-найти конкретную структуру из заголовочного файла и извлечь значения и смещения структурных переменных. Может ли кто-нибудь предложить лучший способ.
Я знаю, что в C#. нет концепции заголовочных файлов, я создал заголовочный файл с некоторыми определениями и структурами для проекта c++. Теперь мне нужно разработать тот же проект, используя C#, в.
У меня есть вопрос, касающийся злоупотребления препроцессором C, с этим конкретным примером, относящимся к gcc в системе Linux (если это имеет значение). Я хочу сделать что-то вроде следующего: char.
Я работаю в процессе удаления связки кода C, который использовал переменные, объявленные в заголовочном файле. Мой компилятор по какой-либо причине не предупреждает о неиспользуемой переменной из.
Я использовал функцию strlen() из библиотеки string.h, не включая заголовок, который я хочу включить из файла заголовка, который изначально реализован, потому что я пишу свою собственную реализацию.
Итак, я пытался изучить cpp, и я писал программу, и когда я пытаюсь построить решение, оно выдает ошибку, говоря: неожиданный конец файла при поиске предварительно скомпилированного заголовка. Вы.
Создания Windows Runtime компонента на Visual C++
Тернистая дорога через дебри C# и заросли C++/CX разработки для Windows Runtime в какой-то момент привела меня к библиотеке шаблонов WRL, облегчающей написание приложений и компонентов WinRT и COM. При работе именно с этой библиотекой мне захотелось узнать, что же может скрывает под собой код:
и эти загадочные макросы, шаблоны, функции библиотеки.
И решил я начать с самой простого. Написать компонент Windows Runtime, имеющий единственный «класс» фоновой задачи, на Visual C++.
Если вам интересно, что из этого получилось, то добро пожаловать под кат.
Создание и настройка проекта компонента
Сначала я создал пустой файл решения в IDE Visual Studio 2013 и добавил в него проект DLL библиотеки для Windows Store приложения.
Для проекта я выбрал имя NMSPC.TestComponent, где NMSPC – некоторое пространство имён. Сделал это в демонстрационных целях, поскольку такое именование является достаточно частой практикой при создание проектов. Также, изменил пространство имён по умолчанию c NMSPC_TestComponent на соответствующее названию проекта.
Для файлов я предпочитаю более короткие названия, поэтому переименовал заголовочный файл и файл исходного кода на TetsComponent. Перед тем, как приступить к реализации компонента в коде, добавил несколько дополнительных файлов. TestComponent.def – файл определения экспортируемых динамической библиотекой функций, TestComponent.idl – файл описания интерфейсов.
Добавив эти файлы в проект, приступил к его настройке. Чтобы не менять настройки для каждой конфигурации по отдельности, мне достаточно было выбрать все конфигурации и платформы, а затем перейти к редактированию параметров. Была задана настройки уровня предупреждений, указан параметр генерации метаданных, изменен шаблон имени генерируемого MIDL компилятором заголовочного файла, добавлена компоновка с runtimeobject.lib и выбрана подсистема.
Далее, настроил дополнительный шаг построения проекта. Про него расскажу чуть-чуть подробнее.
Данный шаг предназначен для правильной генерации метаданных проекта. Командная строка была задана следующим образом:
DEF, MIDL, PCH
Любая «уважающая себя» библиотека компонента Windows Runtime должна экспортировать две очень важные функции DllGetActivationFactory и DllCanUnloadNow, которые используются средой исполнения. Экспорт данных функций был определён в файле TestComponent.def (также их необходимо будет реализовать в коде, но об этом чуть позднее).
Далее, я описал интерфейс класса в файле TestComponent.idl.
Первой директивой импортируется файл с описание интерфейса фоновой задачи Windows::ApplicationModel::Background::IBackgroundTask. Так как этого файла достаточно для MIDL компилятора, то необходимость в импорте других файлов описания интерфейсов отсутствует (для платформы Windows Store 8.1 файлы описания интерфейсов и заголовочные файлы расположены в C:\Program Files (x86)\Windows Kits\8.1\Include\winrt). Пространство имён для класса было выбрано в соответствии с названием проекта NMSPC::TestComponent. С помощью атрибутов были заданы версия класса(version), признак наличия конструктора по-умолчанию(activatable), работа с потоками(threading) и маршалинг(marshaling_behavior). Скомпилировав данный с помощью MIDL компилятора, я получил заголовочный файл TetsComponent.h.
Для уменьшения времени компиляции, дополнительно вынес директивы включения заголовочных файлов activation.h и new в файл pch.h(который используется для генерации предварительно скомпилированных заголовочных файлов). Необходимость включения этих заголовочных файлов объясняется зависимостью от интерфейса IActivationFactory и константы std::nothrow.
Оставалось только реализовать класс, фабрику и экспортируемые функции в коде.
Первым делом, я включил в файл кода TestComponent.cpp кроме файла предкомпилированных заголовков ещё и сгенерированный MIDL компилятором заголовочный файл TestComponent.h. По соглашению, все генерируемые MIDL компиляторам интерфейсы размещаются в пространстве имён ABI, поэтому интерфейсы для класса и его декларация будут располагаться в ABI::NMSPC::TestComponent, а интерфейсы для реализации фоновой задачи в ABI::Windows::ApplicationModel::Background(я не стал импортировать все пространство имён, вместо этого указал использование только отдельных интерфейсов).
Класс реализации фоновой задачи получился достаточно простым. По сути, необходимо было реализовать интерфейсы IUnknown, IInspectable и IBackgroundTask.
Теперь, когда класс был готов, нужно было написать класс фабрики объектов. Данный класс фабрики должен реализовывать интерфейс IActivationFactory, который определён в заголовочном файле activation.h. Данный интерфейс, помимо наследования IInspectable(а значит и IUnknown), определяет метод
Также должна отличаться реализация метода GetRuntimeClassName, о чем говорится в документации к методу на MSDN:
Внимательный читатель мог заметить странную деталь в конструкторах и деструкторах классов, а именно инкремент и декремент переменной m_objectsCount. Данную переменную я объявил сразу после директив using перед кодом классов. А используется она в экспортируемой библиотекой функции DllCanUnloadNow:
Кроме этой функции, была определена ещё одна DllGetActivationFactory, предназначенная для получения фабрики по идентификатору класса(в Windows Runtime это строка с включением всех пространств имён).
Перед тем, как рассказать об использовании компонента в C# приложении, упомяну ещё о явной реализации функции DllMain, определённой в файле dllmain.cpp. Я использовал её только в диагностических целях, но варианты использования могут быть отличными от моего.
На этом реализация библиотеки компонента была закончена. И я смог приступить к её практическому использованию в приложении.
C# приложение
Создав проект приложения NMSPC.CSTestAppp с помощью шаблона Blank App, я добавил в него ссылки на проект компонента и Microsoft Visual C++ 2013 Runtime Package.
Оставалось только отредактировать файл манифеста приложения, добавив в него определение фоновой задачи, и написать код, выполняющий регистрацию фоновой задачи.
Код разместил в методе OnLaunched класса App. Код простой: сначала удаляет все регистрации задач, потом создаёт объект-buiilder задачи, устанавливает триггер, указанный в манифесте, и регистрирует задачу.
Для того, чтобы иметь возможность перехода к точкам останова в коде на C++, установил в настройках отладки проекта приложения тип процесса Mixed(Managed and Native). Кстати, эта настройка также актуальна и для C++/CX приложений.
Теперь можно было запустить приложение в режиме отладки, выполнить код регистрации компонента и протестировать запуск фоновой задачи с помощью кнопки Lifecycle Events раздела Debug Locations.
Выполнив это, я увидел те самые заветные строки в окне Output, вывод которых был запрограммирован в C++ коде с помощью функции OutputDebugStringW.