While in a C shared library, one can do the following to execute an initializer or finalizer when the C program that uses this shared library starts or finishes:
BOOL APIENTRY DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
_initialize();
}
else if (reason == DLL_PROCESS_DETACH)
{
_finalize();
}
return true;
}
This is not working if the same C program is using the static version of the C library instead.
Any idea how this can be fixed?
答案 0 :(得分:0)
当静态库作为程序的一部分启动并完成时,它会“启动”并“完成”。
我在引号中加上了“开始”和“完成”这两个词,因为一旦应用程序被链接,实际上就没有静态库了。静态库中的功能与应用程序中的功能没有区别。
因此,如果您需要在调用特定静态库中的任何函数之前需要做的事情,则必须创建一个初始化函数并从代码中显式调用它,例如通过main()
函数。同样,如果您必须在完成使用静态库中的函数之后必须完成某些工作,则必须创建一个清理函数并从代码中显式调用它。这实际上是相当正常的做法。
还考虑更改DLL,以便您必须以完全相同的方式显式地进行初始化。这有两个优点:
DLLMain
中可以做的事情非常有限。甚至不是内核DLL中的所有函数都可以安全调用。这不适用于DLL加载后调用的显式初始化函数。