ADTF SDK: импортировать манифест и обрабатывать его

Я пытаюсь запустить полную конфигурацию ADTF из своего собственного приложения командной строки C++, используя ADTF SDK. Версия ADTF: 2.9.1 (довольно старая).

Вот что я должен (хочу) сделать:

  1. Загрузить файл манифеста
  2. Загрузить globals-xml
  3. Загрузить config-xml

2 и 3 выполнены с использованием службы диспетчера сеансов - см. Интерфейс ISessionManager: https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_session_manager.html, функции LoadGlobalsFromFile & LoadConfigF.

Проблема в том, что я не знаю, как выполнить пункт 1: в настоящее время вместо загрузки манифеста я вручную загружаю список служб, используя _runtime->RegisterPlugin, _runtime->CreateInstance и _runtime-> RegisterObject.

Мне удалось загрузить только службу пространства имен и использовать интерфейс INamespace, в котором есть метод загрузки файлов манифеста: https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_namespace.html - см. ImportFile с ui32ImportFlags = CF_IMPORT_MANIFEST.

Но это только загружает настройки манифеста в пространство имен, но фактически не создает экземпляры сервисов. Я мог бы сделать это вручную:

  1. Сделайте _runtime->RegisterPlugin для каждого URL- адреса в корневом / плагинов / в пространстве имен
  2. Выполните _runtime->CreateInstance для каждого объекта в root / services / в пространстве имен

Но я хочу, чтобы это было более надежным, и я надеюсь, что уже есть служба, которая впоследствии обрабатывает заполненное пространство имен и выполняет эти действия. Есть ли такая услуга?

Примечание: если вы знаете, как это можно сделать в ADTF3, что также может помочь мне, не стесняйтесь отвечать / комментировать

ОБНОВИТЬ

См. "Поток системы" на этой странице: https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/page_service_layer.html

Очевидно, сам экземпляр среды выполнения обрабатывает файл манифеста (см. Завершение работы уровней ядра и ядра), но я не знаю, как мне сказать ему, где он находится.

Я попытался установить аргументы командной строки равными count = 2 и путь к файлу 2nd = manifest при создании экземпляра cRuntime. Это не работает:).

2 ответа

Решение

Нашел ответ, не совсем то, что я ожидал. Я попытался отладить adtf_runtime.exe, чтобы выяснить, какие аргументы он передает cRuntime.

Результат действительно похож на то, что я подозревал (и на самом деле пытался):

  • arg1 = adtf_runtime.exe (argv [0] в adtf_runtime)
  • arg2 = полный путь к файлу манифеста (например, $ (ADTF_DIR) \ bin \ adtf_devenv.manifest)
  • arg3 = базовое имя файла манифеста, без расширения (например, "adtf_devenv")

Хотя это наводит на мысль, что cRuntime действительно отвечает за загрузку и обработку манифеста, оказалось, что это НЕ совсем так, передача тех же аргументов ему не помогала. Ответ пришел, когда я заметил, что adtf_runtime.exe фактически использует расширение cRuntime, называемое cRuntimeEx, которое НЕ является частью SDK (по крайней мере, я его не нашел).

Этот класс является одним из экспортируемых символов библиотеки ADTF SDK, то есть " dumpbin / symbols adtfsdk_290.lib " рендерит в некоторый момент:

public: __cdecl adtf:: cRuntimeEx:: cRuntimeEx (int, char const * * const, класс ucom::IException * *)

но он НЕ является частью SDK (вы не найдете заголовочный файл, определяющий его).

Среди его методов вы также найдете это:

protected: long __cdecl adtf:: cRuntimeEx:: LoadManifest (класс adtf_util::cString const &, класс std::set, класс std::allocator > *, класс ucom::IException * *)

Вуаля. И поэтому, к сожалению, я не могу добиться того, что я хотел, надежным способом.:)

В итоге я вручную реализовал логику загрузки манифеста, поскольку cRuntimeEx недоступен в SDK. Что-то вроде этого:

  1. Используйте экземпляр cDOM для загрузки файла манифеста
  2. Вызвать FindNodes("/adtf:manifest/environment/variable"), чтобы найти переменные окружения, которые необходимо установить, и установить их с помощью "cSystem:: SetEnvVariable "
  3. Вызовите FindNodes("/adtf:manifest/dependencies/platform"), чтобы найти библиотечные зависимости, и используйте cDynamicLinkage::Load для загрузки библиотек, нацеленных на текущую платформу (win32 / linux)
  4. Вызовите FindNodes("/adtf:manifest/plugins/plugin"), чтобы найти службы, которые будут загружены, используя _runtime-> RegisterPlugin (вы также можете обрабатывать атрибут " необязательно ")
  5. Вызовите FindNodes("/adtf:manifest/services/service"), чтобы найти службы, которые необходимо создать, используя _runtime->CreateInstance и _runtime-> RegisterObject (вы также можете обрабатывать атрибут " необязательно ")
  6. И, наконец, вызовите FindNodes("/adtf:manifest/manifest /manifest") для (рекурсивной) загрузки дочерних манифестов (вы также можете обрабатывать " необязательный " атрибут)

В ADTF3 вы можете просто использовать предоставленный класс cADTFSystem для запуска системы ADTF, а затем использовать интерфейс ISessionManager для загрузки сеанса по вашему выбору.

Единственное, что вам нужно сделать, это запустить модуль запуска adtf с метафайлами (манифест. Это работает как для adtf 2, так и для adtf 3. Это может быть сделано (консольное) приложение. Если вы также хотите сделать немного больше в adtf 3 вы можете использовать элемент управления adtf вместо adtf launcher с его интерфейсом сценариев (см. сценарии в примерах)

Другие вопросы по тегам