ADTF SDK: импортировать манифест и обрабатывать его - PullRequest
0 голосов
/ 29 ноября 2018

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

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

  1. Загрузить манифест файл
  2. Загрузка глобальных-xml
  3. Загрузка config-xml

2 & 3 завершена, используя сервис session-manager - см. Интерфейс ISessionManager : https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_session_manager.html, функции LoadGlobalsFromFile & LoadConfigFromFile .

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

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

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

  1. Do _runtime-> RegisterPlugin для каждого url в root / plugins / впространство имен
  2. Do _runtime-> CreateInstance для каждого objectid в root / services / в пространстве имен

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

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

ОБНОВЛЕНИЕ

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

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

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

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Нашел ответ, не совсем то, что я ожидал.Я попытался отладить 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 , которое является NOT частью SDK (по крайней мере, я его не нашел).

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

public: __cdecl adtf :: cRuntimeEx :: cRuntimeEx (int, char const ** const, class ucom :: IException * *)

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

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

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

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

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

  1. Использование экземпляра cDOM для загрузки файла манифеста
  2. Вызов FindNodes ("/ adtf: manifest / environment / variable ") , чтобы найти переменные окружения, которые необходимо установить, и установить их с помощью " cSystem :: SetEnvVariable"
  3. Call 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") для (рекурсивно) загрузки дочерних манифестов (вы также можете обрабатывать " необязательный атрибут"
0 голосов
/ 11 декабря 2018

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

0 голосов
/ 30 ноября 2018

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

...