【问题标题】:ADTF SDK: import manifest AND handle itADTF SDK:导入清单并处理它
【发布时间】:2018-11-29 20:33:36
【问题描述】:

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

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

  1. 加载清单文件
  2. 加载 globals-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

我设法只加载 namespace service 并使用 INamespace 接口,该接口具有加载清单文件的方法:https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_namespace.html - 请参阅ImportFile 与 ui32ImportFlags = CF_IMPORT_MANIFEST

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

  1. 对下的每个 url 执行 _runtime->RegisterPlugin root/plugins/ 在命名空间中
  2. 对下的每个 objectid 执行 _runtime->CreateInstance root/services/ 在命名空间中

但我希望它更健壮,我希望已经有随后处理填充的命名空间的服务并执行这些操作。 有这样的服务吗?

注意:如果您知道如何在 ADTF3 中做到这一点,这可能对我也有帮助,所以请不要犹豫回答/评论

更新

参见本页“系统流程”:https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/page_service_layer.html

显然运行时实例本身处理清单文件(请参阅运行级别关闭和内核),但我不知道我应该如何告诉它它在哪里。

我尝试在实例化 时将 命令行参数 设置为 count = 22nd = 清单文件路径 >cRuntime它不起作用:)

【问题讨论】:

    标签: automation sdk adtf adtf3


    【解决方案1】:

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

    【讨论】:

    • @CorneliuZuzu,对应于 ADTF2 清单的文件在 ADTF3 中称为 .adtfsystem。它仍然定义加载哪些插件以及实例化哪些服务。是的,cADTFSystem 与 adtf_core.adtfplugin 中的会话管理器相结合,还支持您可以使用 adtf_launcher 可执行文件执行的所有操作。 ADTF 会话 (.adtfsession) 定义了 .adtfsystem、.adtfgraph 和 .adtfproperties 文件的组合。
    • 啊,我明白了。确切的程序是什么?我也没有看到 cADTFSystem 提供加载 .adtfsystem 文件的方法,就像 ADTF2 中的 cRuntime 没有提供加载清单文件的方法一样。 support.digitalwerk.net/adtf/v3/adtf_html/…
    • 创建您的 cADTFSystem 实例并调用其 Launch 方法,然后通过运行时检索 adtf::services::ISessionManager 接口。该接口提供了一个 CreateSession(...) 方法。
    • 我明白了,所以 ISessionManager 有这个能力。我猜会话管理器服务需要手动加载,就像在 ADTF2 中一样,是吗?
    • 请看一下 cADTFSystem 类定义。只需将 adtf_core.adtfplugin 的文件名传递给它的 SetADTFCorePlugin 方法,然后在调用 Launch 之前调用 EnableSessionManagerCreation 方法。
    【解决方案2】:

    找到了答案,但并不完全符合我的预期。我尝试调试 adtf_runtime.exe 以找出它传递给 cRuntime参数

    结果确实与我怀疑(并且实际尝试过)的结果相似:

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

    虽然这建议 cRuntime 确实负责加载和处理清单,但事实证明并非如此,将相同的参数传递给它并没有完成这项工作。当我注意到 adtf_runtime.exe 实际上使用了一个名为 cRuntimeExcRuntime 扩展名时,答案就出来了,这是 NOT SDK 的一部分(至少我还没有找到)。

    该类IS属于ADTF SDK库导出符号,即“dumpbin /symbols adtfsdk_290.lib" 在某个时候呈现:

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

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

    在其方法中您还会发现:

    受保护:long __cdecl adtf::cRuntimeEx::LoadManifest(class adtf_util::cString const &,class std::set,class std::allocator > *,class ucom::IException * *)

    瞧。因此,不幸的是,我无法以稳健的方式实现我想要的。 :)

    最终手动实现清单加载逻辑,因为 SDK 中没有cRuntimeEx 可用。大致如下:

    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(你也可以处理“optional”属性)
    6. 最后,调用 FindNodes("/adtf:manifest/manifests/manifest") 来(递归地)加载子清单(您也可以处理“可选”属性)

    【讨论】:

      【解决方案3】:

      您唯一需要做的就是使用元文件(清单)启动 adtf 启动器。这适用于 adtf 2 和 adtf 3。它可以在(控制台)应用程序中完成。如果您还想做一个在 adtf 3 中,您可以使用 adtf 控件而不是带有脚本界面的 adtf 启动器(参见示例下的脚本)

      【讨论】:

      • 嗨@C-3PFLO,谢谢你的回答。我想从我自己的 C++ 应用程序中以编程方式执行 adtf-launcher 的操作。我需要这样做,因为我还试图以编程方式实现一些其他自定义的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多