Нашел ответ, не совсем то, что я ожидал.Я попытался отладить 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.Что-то вроде этого:
- Использование экземпляра cDOM для загрузки файла манифеста
- Вызов FindNodes ("/ adtf: manifest / environment / variable ") , чтобы найти переменные окружения, которые необходимо установить, и установить их с помощью " cSystem :: SetEnvVariable"
- Call FindNodes ("/ adtf: manifest / dependencies / platform") для поиска библиотечных зависимостей и использования cDynamicLinkage :: Load для загрузки библиотек, предназначенных для текущей платформы ( win32 / linux )
- Позвоните FindNodes ("/ adtf: manifest / plugins / plugin") , чтобы найти загружаемые сервисы, используя _runtime-> RegisterPlugin (вы также можете обрабатывать " необязательный атрибут"
- Вызов FindNodes (" / adtf: manifest / services / service ") для поиска служб, которые необходимо создать с использованием _runtime-> CreateInstance и _runtime-> RegisterObject (вы также можете обрабатывать атрибут « необязательный »)
- И, наконец, вызовите FindNodes ("/ adtf: manifest / manifest / manifest") для (рекурсивно) загрузки дочерних манифестов (вы также можете обрабатывать " необязательный атрибут"