【发布时间】:2019-07-09 09:12:29
【问题描述】:
我有一个加载到 Microsoft 管理控制台 (MMC) 中的 DLL。似乎它的DllGetClassObject 函数正在调用第三方库的一些初始化函数,该函数已知依赖于静态初始化才能完成(因此在常规 C++ 程序中不能在main() 之前调用它)。此功能似乎失败,并且管理单元未显示在 MMC 中。奇怪的是,如果我将它从 MMC 中删除并重新添加,它会成功加载。
关于 C++ 静态初始化何时在 DLL 中准确发生(在回调之前和之后)的信息似乎很少,微软似乎已经删除了它的“DLL 最佳实践”论文,该论文在许多答案和文章中都引用了处理这类问题。
在任何地方(最好在 MSDN 上)是否有一些关于 C++ 静态初始化和 DLL 回调顺序的权威信息?
(我已经尝试过https://docs.microsoft.com/en-us/windows/desktop/api/combaseapi/nf-combaseapi-dllgetclassobject,我希望这会被记录在案)
编辑:将有问题的函数调用从 DllGetClassObject 移动到 DllMain 似乎可以解决问题。不过,仍在寻找权威文档。
编辑:从这个结果和答案得出结论,我在使用第三方初始化函数时遇到的问题不可能是由静态初始化引起的,因为静态初始化应该在 DllMain 之前完成,因此也应该在 @987654329 之前完成@。
【问题讨论】:
-
你在找这个吗:docs.microsoft.com/en-us/windows/desktop/dlls/… 还有docs.microsoft.com/en-us/windows/desktop/dlls/dllmain 否则google 'dllmain raymond chen'(可以被认为是权威的)
-
对这个问题使用恰当的术语,google "c++ static initialization order fiasco"。
-
@SimonMourier 虽然我还没有阅读全部内容,但该文档既没有提到 C++,也没有提到
DllGetClassObject。虽然它确实提出了关于何时初始化静态结构的建议,但我自己无法实现这些建议,因为 C++ 静态初始化的时间是由编译器/链接器控制的,而不是我。 -
@HansPassant 这不是关于多个静态变量的初始化顺序,而是关于DLL中所有静态符号的初始化顺序以及Microsoft定义的DLL中的回调。