4

我正在编写一个可用作 DLL 的跟踪库。它基本上被我系统中的每个组件所消耗。一个棘手的要求是跟踪函数需要在进程生命周期的早期调用,甚至在 main() 运行之前。

该库的使用者包括可执行文件、静态链接的 DLL、延迟加载的 DLL 和动态加载的 DLL。所有的变化。

一些跟踪功能在静态初始化中不能很好地发挥作用,但其他的很好。理想情况下,我希望能够在初始化期间为消费者提供最少的安全功能,然后在初始化完成后提供全部功能。

要求消费者自己进行明确的“我完成初始化”调用是行不通的,因为某些消费者本身就是 DLL,并且无法控制托管它们的可执行文件。同样的问题只是将链条上移一级。

我希望有某种方法可以让我询问运行时是否或我当前正在静态初始化中运行,或者该阶段是否已完成。这样的事情可能吗?

更复杂的是,我需要在 5 个平台上运行。我不需要一次写入的解决方案,但我确实需要让它在所有平台上以某种方式工作。

4

3 回答 3

1

全局变量?就像是:

bool initTime = true;

在你的 DLL 中,然后

int main()
{
  initTime = false;
  // your main code comes here
}

在您的可执行文件中。

于 2010-07-20T20:01:22.360 回答
0

您可能必须重写(好吧,修改)然后与您重写的 crt0.o 链接。对于每个平台,这显然必须有所不同。

于 2010-07-21T16:18:58.937 回答
0

你这样写

一些跟踪功能在静态初始化中不能很好地发挥作用,但其他的很好。

但是,大多数时候问题不在于可执行文件(进程)的静态初始化阶段,而在于/a DLL的静态初始化阶段。您必须知道,每个 DLL 都有自己的静态初始化阶段,因为它是静态 C++ 对象。特别是您的跟踪 DLL 也有,任何其他可能使用您的 DLL 的 DLL 也有。

总结一下:您可能并不关心可执行文件的静态初始化阶段是否完成,但您确实关心 a) 您自己的 DLL 是否已完成初始化,以及 b) 在调用您的 DLL 时是否当前持有加载程序锁。

至于a)如果您的DLL完成初始化只是代码内部的一个问题,因为在初始化之前没有人可以调用您的DLL。

至于 b) 似乎没有(可移植的,记录在案的)方法可以从代码中确定当前是否持有加载程序锁。除了清楚地记录在持有加载程序锁时不能调用哪些函数之外,我不知道任何其他方法。

于 2010-07-21T15:22:19.303 回答