ADTF SDK:导入清单并处理它



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

以下是我想做的事情:

  1. 加载清单文件
  2. 加载全局xml
  3. 加载配置xml

2&3使用会话管理器服务完成-请参阅ISessionManager界面:https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/classadtf_1_1_i_session_manager.html,函数LoadGlobalsFromFile&从文件加载配置

问题是我不知道如何执行第1点:目前,我没有加载清单,而是使用_runtime->RegisterPlugin_runtime->CreateInstance-runtime->RegistryObject手动加载服务列表

我所做的是只加载命名空间服务,并使用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. 对下的每个对象执行_runtime->CreateInstance命名空间中的root/services/

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

注意:如果你知道如何在ADTF3中完成这项工作,那么可能对我也有帮助,所以请毫不犹豫地回答/评论

更新

请参阅本页的"系统流程":https://support.digitalwerk.net/adtf/v2/adtf_sdk_html_docs/page_service_layer.html

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

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

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

找到了答案,但并不是我所期望的。我尝试调试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的扩展名,它是SDK中的NOT部分(至少我还没有找到它)时,答案就来了。

ADTF SDK库导出符号中的此类IS,即">dumpbin/symbols adtfsdk_290.lib"在某个点渲染:

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

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

在其方法中您还会发现:

protected:long __cdecl adtf::cRuntimeEx::LoadManifest(类adtf_util::cString const&,类std::set,类std::分配器>*,类ucom::IException**)

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

最终手动实现了清单加载逻辑,因为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:manist/plugins/plugin")以查找要使用_runtime->RegisterPlugin加载的服务(您也可以处理">可选"属性)
  5. 调用FindNodes("/adtf:manifest/services/service")以查找需要使用_runtime->CreateInstance_runtime->RegisterObject创建的服务(您还可以处理">可选"属性)
  6. 最后,调用FindNodes("/adtf:manifest/manifest")以(递归)加载子清单(您也可以处理">可选"属性)

您唯一需要做的就是用元文件(manifest)启动adtf启动器。这适用于adtf 2和adtf 3。它可以做(控制台)应用程序。如果你还想在adtf 3中做更多的工作,你可以使用adtf控件,而不是带有脚本接口的adtf启动器(参见示例中的脚本)

最新更新