ADTF SDK:导入清单并处理它

ADTF SDK: import manifest AND handle it

我正在尝试从我自己的 C++ 命令行应用程序 运行 完整的 ADTF 配置 使用 ADTF SDK。 ADTF 版本:2.9.1(很旧)。

这是我必须(想要)做的事情:

  1. 加载清单文件
  2. 加载全局变量-xml
  3. 加载配置-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 点:目前,我没有加载清单,而是使用 [=37 手动加载服务列表=]_运行time->RegisterPlugin, _运行time->CreateInstance and _运行 time->RegisterObject.

我设法做的是仅加载 命名空间服务 并使用具有加载方法的 INamespace 接口清单文件:https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_namespace.html - 请参阅 ImportFile 和 ui32ImportFlags = CF_IMPORT_MANIFEST

但是这只会将清单设置加载到命名空间,它不会实际实例化服务。我可以通过以下方式手动完成:

  1. 对每个url执行_运行time->RegisterPlugin root/plugins/ 命名空间
  2. 为每个 objectid 执行 _运行time->CreateInstance root/services/ 命名空间

但我希望它更 健壮 我希望已经有 一个服务随后处理填充的命名空间 并且确实这些动作。 有这样的服务吗?

注意:如果您知道如何在 ADTF3 中完成此操作,那可能 对我也有帮助,所以不要犹豫answer/comment

更新

请参阅此页面上的 "Flow of the system":https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/page_service_layer.html

显然 运行time 实例本身处理 manifest 文件(参见 运行-levels shutdown & kernel)但我不知道如何我应该告诉它它在哪里。

我尝试将 命令行参数 设置为 count = 2 并且 2nd = manifest实例化 cRuntime 时的文件路径没用:).

您唯一需要做的就是使用元文件(清单)启动 adtf 启动器。这适用于 adtf 2 和 adtf 3。它可以完成(控制台)应用程序。如果您还想在 adtf 3 中做更多的事情,您可以使用 adtf control 而不是 adtf launcher 及其脚本接口(参见示例下的脚本)

找到了答案,虽然与我预期的不完全一样。我尝试调试 adtf_runtime.exe 以找出它传递给 cRuntime.

arguments

结果确实和我怀疑的(实际试过的)相似:

  • arg1 = adtf_runtime.exe(argv[0] 在 adtf_runtime
  • arg2 = 清单文件的完整路径(例如 $(ADTF_DIR)\bin\adtf_devenv.manifest)
  • arg3 = 清单文件的基本名称,不带扩展名(例如"adtf_devenv")

虽然这个 建议 cRuntime 确实负责 加载和处理清单 ,结果是不完全,向它传递相同的参数并没有完成工作。当我注意到 adtf_runtime.exe 实际上使用的是 cRuntime 的扩展名 cRuntimeEx[=78= 时,答案就来了] 这是 NOT SDK 的一部分(至少我没找到)。

ADTF SDK 库导出的符号中的这个class,即“dumpbin /symbols adtfsdk_290.lib”在某个点呈现:

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

但它不是 SDK 的一部分(您找不到定义它的头文件)。

在它的方法中您还会发现:

protected: long __cdecl adtf::cRuntimeEx::LoadManifest(class adtf_util::cString const &,class std::set,class std::allocator > *,class 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[=创建的服务78=] 和 _runtime->RegisterObject(你也可以处理“optional”属性)
  6. 最后,调用 FindNodes("/adtf:manifest/manifests/manifest") 以(递归地)加载子清单(您也可以处理“可选”属性)

在 ADTF3 中,您可以只使用提供的 cADTFSystem class 启动 ADTF 系统,然后使用 ISessionManager 界面加载您选择的会话。