在C ++ Micro Services库的上下文中,我们将统一调用所有支持的“共享库”类型(如DLL,DSO,DyLib等)作为模块。一个模块通过其特有的ModuleContext对象访问C ++ Micro Services API。
1 创建一个模块上下文
有两种方法来为特定库创建一个ModuleContext对象:
- 如果项目使用CMake作为构建系统,可使用提供的#usFunctionGenerateModuleInit CMake函数来自动创建源文件并将其添加到模块的源文件中:
set(module_srcs )
usFunctionGenerateModuleInit(module_srcs)
add_library(mylib ${module_srcs})
set_property(TARGET ${mylib} APPEND PROPERTY COMPILE_DEFINITIONS US_MODULE_NAME=mylib)
你还需要使用US_MODULE_NAME来为模块指定唯一的名称,如最后一行所示。模块名称必须是有效的C标识符,如果是可执行文件,则需要将其定义为main。
- 如果你不使用CMake,则必须在模块的其中一个源文件中添加对宏US_INITIALIZE_MODULE的调用:
#include <usModuleInitialization.h>
US_INITIALIZE_MODULE
2 获取一个模块上下文
使用#GetModuleContext函数,可在模块中的任何位置检索特定模块的ModuleContext对象:
#include <usGetModuleContext.h>
#include <usModule.h>
#include <usModuleContext.h>
US_USE_NAMESPACE
void RetrieveModuleContext()
{
ModuleContext* context = GetModuleContext();
Module* module = context->GetModule();
std::cout << "Module name: " << module->GetName() << " [id: " << module->GetModuleId() << "]\n";
}
请注意,尝试使用#GetModuleContext,而在使用共享库中没有正确的初始化代码,同时导致编译或运行时的错误。