How to call function of a static library when executing the program that uses this library

时间:2019-03-06 11:36:34

标签: c visual-studio

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?

1 个答案:

答案 0 :(得分:0)

当静态库作为程序的一部分启动并完成时,它会“启动”并“完成”。

我在引号中加上了“开始”和“完成”这两个词,因为一旦应用程序被链接,实际上就没有静态库了。静态库中的功能与应用程序中的功能没有区别。

因此,如果您需要在调用特定静态库中的任何函数之前需要做的事情,则必须创建一个初始化函数并从代码中显式调用它,例如通过main()函数。同样,如果您必须在完成使用静态库中的函数之后必须完成某些工作,则必须创建一个清理函数并从代码中显式调用它。这实际上是相当正常的做法。

还考虑更改DLL,以便您必须以完全相同的方式显式地进行初始化。这有两个优点:

  • 如果更改库的链接方式,则无需更改应用程序代码
  • 您在DLLMain中可以做的事情非常有限。甚至不是内核DLL中的所有函数都可以安全调用。这不适用于DLL加载后调用的显式初始化函数。