项目被编译成一个dll以注入可执行文件
该项目依赖于一个API,它在main()的最开始时初始化,如下所示:
int DLL_main()
{
TheApi::Initialize();
AnObject anObjectInstance;
//..
}
有一个对象使用类似于此的类定义构造:
class AnObject()
{
AnObject();
~AnObject();
static ApiHelper apiHelperObject; //This object assists in making certain api features easier to use
}
//Inside AnObject.cpp
ApiHelper AnObject::apiHelperObject;
在apiHelperObject
的构造函数中,有一些API函数调用
注入dll后,没有任何反应(也没有错误信息)但是,
从apiHelperObject
删除静态关键字时,一切正常
问题似乎是在 API初始化之前构建的静态成员
无法在TheApi::Initialize()
的构造函数中调用apiHelperObject
,因为有多个不同的api辅助对象,这会导致TheApi::Initialize()
被多次调用
所以问题是:
在构造静态成员对象之前初始化api的最佳方法是什么?或者,延迟构建静态成员的最佳方法是什么?
优选地,不使用指针,因为语法不是特别受欢迎的
谢谢
答案 0 :(得分:5)
在普通的标准C ++中,你总是可以通过使static
对象作为访问器函数的本地来延迟它的初始化。
基本上,这是迈耶斯'单:
auto helper_object()
-> ApiHelper&
{
static ApiHelper the_object;
return the_object;
}
这里,在标准C ++中,对象在第一次执行时通过声明进行初始化。
但是C ++标准并不主动支持动态库,更不用说DLL注入了。因此很难说这将如何发挥作用。小心线程问题。