2

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

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

  1. 加载清单文件
  2. 加载 globals-xml
  3. 加载配置-xml

使用会话管理器服务完成 2 和 3 - 请参阅ISessionManager界面: https: //support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_session_manager.html,函数LoadGlobalsFromFileLoadConfigFromFile

问题是我不知道如何做第 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

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

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

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

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

更新

请参阅此页面上的“系统流程”:https: //support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/page_service_layer.html

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

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

4

3 回答 3

3

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

于 2018-12-11T10:52:38.400 回答
2

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

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

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

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

此类是ADTF SDK 库导出符号之一,即“ dumpbin /symbols adtfsdk_290.lib 在某些时候呈现:

公共:__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 * *)

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

最终手动实现了清单加载逻辑,因为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创建的服务(您也可以处理“可选”属性)
  6. 最后,调用FindNodes("/adtf:manifest/manifests/manifest")来(递归地)加载子清单(您也可以处理“可选”属性)
于 2018-12-01T12:51:58.397 回答
0

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

于 2018-11-30T13:12:03.427 回答