首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADTF SDK:导入清单并处理它

ADTF SDK:导入清单并处理它
EN

Stack Overflow用户
提问于 2018-11-29 20:33:36
回答 3查看 319关注 0票数 2

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

以下是我要做的事情:

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

使用session-manager服务完成2和3,请参阅ISessionManager接口:manager.html、#en3# LoadGlobalsFromFile和LoadConfigFromFile.

问题是,我不知道如何执行第1点( _runtime->RegisterPlugin,_runtime->CreateInstance ):目前,我使用_runtime->RegisterPlugin,_runtime->CreateInstance和_runtime->RegisterObject.手动加载服务列表,而不是加载清单

我所做的就是只加载命名空间服务,并使用INamespace接口,该接口有一个加载清单文件的方法:namespace.html --参见ImportFile with ui32ImportFlags =

但是--它只将清单设置加载到名称空间中,实际上并不实例化服务。我可以手动完成,方法是:

  1. 对命名空间中root/plugins/下的每个url执行
  2. 对命名空间中root/services/下的每个对象执行

但是我希望这是一个更加的健壮的,我希望已经有了,一个处理填充的名称空间的服务,然后是并执行这些操作。有这样的服务吗?

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

更新

请参阅本页上的“系统流程”:layer.html

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

在实例化cRuntime时,我尝试将命令行参数设置为count = 2和2=清单文件路径。它不工作:)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-01 12:51:58

找到了答案,但不是我所期望的。我试着调试adtf_runtime.exe,以找出它传递给cRuntime参数

其结果确实与我所怀疑的(而且实际上已经尝试过)相似:

  • arg1 = adtf_runtime.exe (argv in adtf_runtime)
  • arg2 =清单文件的完整路径(例如$(ADTF_DIR)\bin\adtf_devenv.manifest)
  • arg3 =清单文件的basename,没有扩展名(例如"adtf_devenv")

虽然这个建议cRuntime确实负责加载和处理清单,但结果发现并不完全是,向它传递相同的参数并没有完成任务。当我注意到adtf_runtime.exe实际上正在使用cRuntime的扩展cRuntimeEx,这是而不是SDK的一部分(至少我还没有找到)时,就给出了答案。

这个类是,是ADTF库的导出符号中的一个,即"dumpbin /symbols adtfsdk_290.lib“在某个点上呈现:

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

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

在的方法中,您还会发现以下内容:

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

瞧。因此,不幸的是,我无法以一种强有力的方式实现我想要的。:)

我的最终手动实现了清单加载逻辑的,因为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_runtime->RegisterObject创建的服务(您还可以处理“可选”属性)
  6. 最后,调用FindNodes("/adtf:manifest/manifests/manifest")到(递归)加载子清单(您还可以处理"optional“属性)。
票数 2
EN

Stack Overflow用户

发布于 2018-12-11 10:52:38

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

票数 3
EN

Stack Overflow用户

发布于 2018-11-30 13:12:03

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53547130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档